外部アプリケーションでの Retail Server API の使用
この記事では、外部アプリケーションで Retail Server API を使用する方法について説明します。 Retail Server は、外部アプリケーションが API を使用できるように、Open Data Protocol (OData) Web エンドポイントを公開します。 また、Retail Server は Commerce Runtime (CRT) ビジネス ロジックをホストし、それを OData エンドポイントとして公開します。 これらのエンドポイントは、Retail Server API と呼ばれます。
外部アプリケーションでは、HTTPS を使用して OData サービスを使用できます。 Retail Server には、API を利用するための複数のオプションがあります。
小売サーバー : APIを強力に入力した方法。 さまざまなアプリケーションのタイプに対して公開される複数のタイプのプロキシがあります。
- C# プロキシ : サーバー側およびネイティブのアプリケーションは、C# バイナリ (クラス ライブラリ) を使用してAPIと他のエンティティにアクセスできます。
- TypeScriptプロキシ : クライアント アプリケーションは、データ プロキシ .tsを使用してAPIなどのエンティティにアクセスできます。
[ODataクライアント ] : APIは、ODataクライアントから、またはRetail Server URLにHTTPS要求を生成して消費することもできます。
メタデータを参照するには、Web ブラウザーの次のフォーマットで Retail Server の URL を開きます。 すると、すべての Retail Server API、および入出力パラメータの一覧が表示されます。
https://RS-URL/Commerce/$metadata
API の使用に必要なセキュリティと認証
各 API へのアクセスは、ネイティブで次のロールに従って制限されます。
- 従業員 : このロールに関連付けられたAPIへのアクセスには、ポイントする (POS) デバイス の有効化 (デバイス トークン) と認証された従業員が必要です。
- [顧客 / 顧客] : このロールに関連付けられたAPIへのアクセスには、認証された顧客が必要です。 通常、E コマース サイトでは、これらの API を使用して、注文履歴の取得や顧客の詳細の変更などの操作を実行します。
- [アプリケーション ] : このロールに関連付けられたAPIへのアクセスには、アプリケーション Microsoft Entra サービス間認証などのアプリケーション レベルの認証が必要です。
- 匿名 : このロールに関連付けられたAPIは、主に、ユーザー認証を行わずに電子コマース サイトで使用されます。
- カスタマイズされたAPI : このロールに関連付けられたAPIへのアクセスは、POSデバイスの有効化、顧客認証、匿名認証などの方法で制限できます。
外部アプリケーションの統合では、API にアクセスするためにアプリケーション認証フローのみを必要とします。 E コマース アプリケーションの統合には、顧客認証が必要です。
この記事では、アプリケーション認証フローの設定と、アプリケーション認証コンテキストを使用した API へのアクセスに重点を置いて説明します。
外部アプリケーションから API にアクセスする前に、外部アプリケーションを Azure アプリ登録に登録する必要があります。また、登録されたアプリケーションの詳細を Commerce Headquarters に追加する必要があります。
認証フローの詳細については、Dynamics 365 Commerce 認証フロー を参照してください。
Azure アプリ登録で、アプリケーションを登録する
Retail Server のアプリ登録
アプリケーションの登録は、アプリと Microsoft ID プラットフォームとの間に信頼関係を確立します。 信頼は単一方向で、アプリケーションは Microsoft ID プラットフォームを信頼しますが、逆向きでは信頼されません。 アプリの登録を作成するには、次の手順に従います。
- Azure ポータルにサインインします。
- 複数のテナントへのアクセス許可がある場合は、トップメニューのディレクトリ + サブスクリプションフィルターを使用して、アプリケーションを登録するテナントを選択します。
- Microsoft Entra ID を検索して選択します。
- 管理で、アプリの登録を選択し、新規登録を選択します。
- アプリケーションの名前を入力します。 アプリのユーザーにはこの名前が表示されます。後で変更することもできます。
- この組織ディレクトリのアカウントのみ (Microsoft のみ、単一テナント) としてこのアプリケーションを使用できるユーザーを指定します。
- URI のリダイレクトフィールドは既定値のままにします。 何も変更しないでください。
- 登録を選択して、最初のアプリ登録を行います。
- API の公開を選択し、スコープの追加を選択します。 スコープ名を作成し、同意で、管理者とユーザーを選び管理者の同意表示名と説明を入力します。
- 状態を有効にするに設定します。
- スコープの追加を選択し、スコープ登録を完了します。
- スコープが作成された後、"api://.." で始まる Application ID URI を クリップボードにコピーします。 これは、後で使用される Server Resource ID です。
クライアント用アプリケーション登録の作成
- 上記の手順 2-8 に従い、アプリケーション登録に必ず別の名前を指定してください。
- API 許可を選択します。
- API アクセス許可の要求ページで、組織で使用する API を選択し、手順 2-8 で作成したアプリを検索します。
- API を選択し、アクセス許可を確認します。 新しいウィンドウで開き、アクセス許可の追加を選択
登録が完了すると、Azure ポータルに、アプリ登録の概要ウィンドウが表示されます。 このウィンドウには、アプリケーション (クライアント) ID フィールドが表示されます。 このフィールドの値は、アプリケーション ID またはクライアント ID と呼ばれます。 Microsoft ID プラットフォームでアプリケーションを一意に識別します。
クライアント シークレットの追加
クライアント シークレットは、アプリケーション パスワードと呼ばれることもあります。 これは、アプリが、自身の ID に対する証明書の代わりとして使用できる文字列値です。
- Azure ポータルの アプリ登録 で、使用しているアプリケーションを選択します (クライアントに登録されたアプリ)。
- 証明書 & シークレット>新しいクライアント シークレット を選択します。
- クライアント シークレットの説明を入力します。
- 期間を選択します。
- 追加を選択します。
- シークレットの値は、クライアント アプリケーション コードで使用できるように必ず書き留めてください。
Retail Server から信頼されるために、財務と運用アプリで対象アプリを登録する
- Commerce Headquarters で、Retail と Commerce>Headquarters の設定>パラメーター>Commerce 共有パラメーターに移動します。
- ID プロバイダー クイック タブで、
Microsoft Entra ID
タイプのプロバイダーを選択します。 選択に基づいて、依存する関係者クイック タブの値が設定されます。 - 依存する関係者クイック タブで、追加を選択します。 クライアント アプリ (ヘッドレス Commerce アプリではない) の登録時に生成されたクライアント ID を入力します。 Type フィールドを機密情報に、UserTypeフィールドをアプリケーションに設定します。
- アクション ウィンドウで、保存を選択します。
- 新しい依存する関係者を選択し、サーバー リソース ID クイック タブで追加を選択します。 サーバー リソース ID 列にアプリケーション ID URI を入力します (これは、Retail Server アプリ登録時に生成される API URI です)。
- アクション ウィンドウで、保存を選択します。
- Retail と Commerce>Retail と Commerce IT>配送スケジュールに移動し、Commerce Data Exchange (CDX) ジョブ 1110 を実行します。
コンソール アプリケーションを使用した Retail Server API へのアクセス
Visual Studio 2017 を使用して、コンソール アプリケーションを作成します。
App.config ファイルには、次のコンフィギュレーションを含めます。
<appSettings> <add key="aadClientId" value="client id generated during the client app registration in Azure" /> <add key="aadClientSecret" value="client secret generated during the client app registration in Azure" /> <add key="aadAuthority" value="https://sts.windows.net/tenant id/" /> <add key="retailServerUrl" value="https://RetailserverURL/Commerce" /> <add key="resource" value="api://2fxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" /> <!-- //Application ID URI generated during the Retail Server app registration --> <add key="operatingUnitNumber" value="OUN value" /> </appSettings>
実際の値によるコンフィギュレーション設定の更新
プロジェクトの NuGet パッケージ マネージャを使用して、以下の NuGet パッケージを追加します。
- Microsoft.Identity.Client
- Microsoft.Dynamics.Commerce.RetailProxy
Microsoft.Dynamics.Commerce.RetailProxy NuGet パッケージは、RetailSDK\Pkgs フォルダから追加することができます。 NuGet マネージャで、RetailSDK\pkgs フォルダのローカル リポジトリを追加します。
Program.cs ファイルに、以下の変数を追加します。
private static string clientId; private static string clientSecret; private static Uri retailServerUrl; private static string resource; private static string operatingUnitNumber; private static Uri authority;
Program.cs ファイルに、アプリ設定を読み取るための GetConfiguration メソッドを追加します。
private static void GetConfiguration() { clientId = ConfigurationManager.AppSettings["aadClientId"]; clientSecret = ConfigurationManager.AppSettings["aadClientSecret"]; authority = new Uri(ConfigurationManager.AppSettings["aadAuthority"]); retailServerUrl = new Uri(ConfigurationManager.AppSettings["retailServerUrl"]); operatingUnitNumber = ConfigurationManager.AppSettings["operatingUnitNumber"]; resource = ConfigurationManager.AppSettings["resource"]; }
Program.cs ファイルに、アクセス トークンを取得するための CreateManagerFactory メソッドを追加します。
private static async Task<ManagerFactory> CreateManagerFactory() { Microsoft.Identity.Client.AuthenticationContext authenticationContext = new Microsoft.Identity.Client.AuthenticationContext(authority.ToString(), false); AuthenticationResult authResult = null; authResult = await authenticationContext.AcquireTokenAsync(resource, new ClientCredential(clientId, clientSecret)); ClientCredentialsToken clientCredentialsToken = new ClientCredentialsToken(authResult.AccessToken); RetailServerContext retailServerContext = RetailServerContext.Create(retailServerUrl, operatingUnitNumber, clientCredentialsToken); ManagerFactory factory = ManagerFactory.Create(retailServerContext); return factory; }
GetOrderHistory メソッドを追加して、注文を読み取ります。
private static async Task<Microsoft.Dynamics.Commerce.RetailProxy.PagedResult<SalesOrder>> GetOrderHistory(string customerId) { QueryResultSettings querySettings = new QueryResultSettings { Paging = new PagingInfo() { Top = 10, Skip = 10 } }; ManagerFactory managerFactory = await CreateManagerFactory(); ICustomerManager customerManage = managerFactory.GetManager<ICustomerManager>(); return await customerManage.GetOrderHistory(customerId, querySettings); }
Main メソッドでは、GetOrderHistory メソッドを呼び出してレコードを読み取ります。
static void Main(string[] args) { GetConfiguration(); Microsoft.Dynamics.Commerce.RetailProxy.PagedResult<SalesOrder> orderHistory = Task.Run(async () => await GetOrderHistory("2001")).Result; Console.WriteLine(orderHistory.Results.GetEnumerator().Current.Id); }