こんにちは。CData Software Japanリードエンジニアの杉本です。
以前このBlogで、Dynamics 365・Dataverse Web APIに接続する際のOAuthアプローチとして、Client Credentialを紹介したことがありました。
この Client Credential のメリットはブラウザを使った、認証・認可の仕組みが不要なこと、例えばバッチ処理やデーモンなどのプログラムを使う際に便利なことがあげられます。
ただ、それと引き換えにちょっと面倒なこととして、Application User なるものをDynamics 365・Dataverse上のユーザー管理で作成しなければいけないというものがありました。
既存のユーザーとは別にアプリケーション用のユーザーとなるので、便利といえば便利なんですが、ちょっとアプローチが回りくどく、分かりづらい点がありますね。
実は、ブラウザを経由しない別なアプローチとして、ユーザーのID・PWを使用した PasswordGrant も使うことができます。
公式リファレンスではサンプルコードのみの記載なので分かりづらいのですが・・・、今回はこのPasswordGrant の実施方法を解説したいと思います。
なお、Postman での利用方法を解説した後に、CData Driverでの利用方法を記載しています。
- アプリの登録
- Access Tokenを取得する
- CData Dynamics 365 for Sales / Dataverse Driver でのP asswordGrant の使用方法
- おわりに
アプリの登録
何はともあれ、まずは Azure ADにアプリを登録しましょう。基本的な手順は今までの記事に書いてあるのと一緒です。
Azure Active Directory 管理センターに移動し、「アプリの登録」→「+新規登録」をクリック。
任意のアプリケーション名を入力して、シングルテナントアプリケーションとして作成します。リダイレクトURIはローカルホストでかまいません。今回は特に使うシチュエーションがないためです。
アプリを作成したら、クライアントIDを控えておきます。
次に、「証明書とシークレット」の画面に移動して、クライアントシークレットを作成します。任意の名称と有効期間で登録し
生成されたクライアントシークレットを同じように控えておきます。
最後にAPIのアクセス許可を設定します。
Dataverse(CDS)の場合は「PowerApps Runtime Service」、Dynamics 365 Salesの場合は「Dynamics CRM」を付与します。(なお、Dataverse(CDS)も内部的には Dynamics 365 APIが利用できるので、Dynamics CRMの権限でも大丈夫です。)
そして以下の「委任されたアクセス許可」を付与してあげます。
これでAzure AD側の準備は完了です。
Access Tokenを取得する
それでは Postman を使って PasswordGrant で Access Tokenを取得してみましょう。
リクエスト先はPOSTメソッドで「https://login.microsoftonline.com/organizations/oauth2/v2.0/token」です。OrganizationsはTenantIdでもかまいません。
(※Commonは使えないので注意しましょう)
リクエストBodyのContent-Typeは「application/x-www-form-urlencoded」を指定してください。
リクエストBodyのパラメータは以下のとおりです。
プロパティ名 | 値 | 備考 |
---|---|---|
grant_type | password | PasswordGrantを指定します |
username | 例)XXX@XXX.onmicrosoft.com | ログインユーザーを指定します。 |
password | 例)YOUR_PASSWORD | ログインユーザーのパスワードを指定します。 |
scope | 例)https://XXXXX.crm7.dynamics.com/user_impersonation | XXXX |
client_id | 例)2416249a-XXXX-XXXX-bd15-49sb3fc76fad | Azure ADに登録したアプリのアプリケーションIDを指定します |
client_secret | 例)10218MbCt5~.XXXXX.yeOnM6.-i~C1 | Azure ADに登録したアプリのクライアントシークレットを指定します |
これで以下のようにAccess Tokenを取得できます。
あとは取得したAccess Tokenを使って、以下のようにリクエストを行えば、実際にDynamics 365・Dataverseのデータが取得できます。
GET /api/data/v9.0/accounts HTTP/1.1 Host: XXXX.crm7.dynamics.com Authorization: Bearer eyJ0eXAiOiJKV1QiLCJh~~
CData Dynamics 365 for Sales / Dataverse Driver でのP asswordGrant の使用方法
このPasswordGrantのアプローチはもちろんCData Dynamics 365 for Sales / Dataverse Driverでも利用できます。
接続プロパティを以下のように入力して、接続してください。(User・Passwordの項目がない場合は、Otherの欄にUser=XXX;Password=XXX;というような形式で入力してください。)
プロパティ名 | 値 | 備考 |
---|---|---|
Organization URL | 例)https://XXXX.crm7.dynamics.com/ | 接続先のテナントURLを指定します。 |
User | 例)XXX@XXX.onmicrosoft.com | ログインユーザーを指定します。 |
Password | 例)YOUR_PASSWORD | ログインユーザーのパスワードを指定します。 |
OAuth Client Id | 例)c5197f7c-XXXX-4948-885a-74a11da873e4 | Azure ADに登録したアプリのアプリケーションIDを指定します。 |
OAuth Client Secret | 例)t7HA~_B~XXXXX.7NS6j_78-YQruid3 | Azure ADに登録したアプリのクライアントシークレットを指定します。 |
OAuth Grant Type | PASSWORD | 固定でPASSWORDを指定します。 |
Azure Tenant | organizations | 固定でOrganizationsもしくはTenantIdを指定します。 |
以下のように接続テストに成功しました、と表示されればOKです。
あとはお好みのツールから接続して、Dynamics 365・Dataverseのデータにアクセスできます。
おわりに
Client Credentialのアプローチと違って、アプリケーションユーザーの作成が必要なく、わかりやすいですね。
ただ、Passwordをプログラムの中に入れないといけないので、その運用・管理には注意してください。
CData Driverで利用する上で不明な点があれば、お気軽にテクニカルサポートまでどうぞお問い合わせください。