CData Software Blog

クラウド連携のCData Software の技術ブログです。

Dynamics 365(CRM)・Dataverse Web API で OAuth Password Grant 接続を利用する方法

f:id:sugimomoto:20210624094155p:plain

こんにちは。CData Software Japanリードエンジニアの杉本です。

以前このBlogで、Dynamics 365・Dataverse Web APIに接続する際のOAuthアプローチとして、Client Credentialを紹介したことがありました。

www.cdatablog.jp

この Client Credential のメリットはブラウザを使った、認証・認可の仕組みが不要なこと、例えばバッチ処理やデーモンなどのプログラムを使う際に便利なことがあげられます。

ただ、それと引き換えにちょっと面倒なこととして、Application User なるものをDynamics 365・Dataverse上のユーザー管理で作成しなければいけないというものがありました。

f:id:sugimomoto:20210624093805p:plain

既存のユーザーとは別にアプリケーション用のユーザーとなるので、便利といえば便利なんですが、ちょっとアプローチが回りくどく、分かりづらい点がありますね。

実は、ブラウザを経由しない別なアプローチとして、ユーザーのID・PWを使用した PasswordGrant も使うことができます。

docs.microsoft.com

公式リファレンスではサンプルコードのみの記載なので分かりづらいのですが・・・、今回はこのPasswordGrant の実施方法を解説したいと思います。

なお、Postman での利用方法を解説した後に、CData Driverでの利用方法を記載しています。

アプリの登録

何はともあれ、まずは Azure ADにアプリを登録しましょう。基本的な手順は今までの記事に書いてあるのと一緒です。

Azure Active Directory 管理センターに移動し、「アプリの登録」→「+新規登録」をクリック。

f:id:sugimomoto:20191014223210p:plain

任意のアプリケーション名を入力して、シングルテナントアプリケーションとして作成します。リダイレクトURIはローカルホストでかまいません。今回は特に使うシチュエーションがないためです。

f:id:sugimomoto:20191014223215p:plain

アプリを作成したら、クライアントIDを控えておきます。

f:id:sugimomoto:20191014223221p:plain

次に、「証明書とシークレット」の画面に移動して、クライアントシークレットを作成します。任意の名称と有効期間で登録し

f:id:sugimomoto:20191014223230p:plain

生成されたクライアントシークレットを同じように控えておきます。

f:id:sugimomoto:20191014223236p:plain

最後にAPIのアクセス許可を設定します。

f:id:sugimomoto:20191014223244p:plain

Dataverse(CDS)の場合は「PowerApps Runtime Service」、Dynamics 365 Salesの場合は「Dynamics CRM」を付与します。(なお、Dataverse(CDS)も内部的には Dynamics 365 APIが利用できるので、Dynamics CRMの権限でも大丈夫です。)

f:id:sugimomoto:20200726140248p:plain

f:id:sugimomoto:20191014223252p:plain

そして以下の「委任されたアクセス許可」を付与してあげます。

f:id:sugimomoto:20191014223259p:plain

これで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を取得できます。

f:id:sugimomoto:20210624093942p:plain

あとは取得したAccess Tokenを使って、以下のようにリクエストを行えば、実際にDynamics 365・Dataverseのデータが取得できます。

GET /api/data/v9.0/accounts HTTP/1.1
Host: XXXX.crm7.dynamics.com
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJh~~

f:id:sugimomoto:20210624093949p:plain

CData Dynamics 365 for Sales / Dataverse Driver でのP asswordGrant の使用方法

このPasswordGrantのアプローチはもちろんCData Dynamics 365 for Sales / Dataverse Driverでも利用できます。

www.cdata.com

www.cdata.com

接続プロパティを以下のように入力して、接続してください。(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を指定します。

f:id:sugimomoto:20210624093958p:plain

以下のように接続テストに成功しました、と表示されればOKです。

f:id:sugimomoto:20210624094004p:plain

あとはお好みのツールから接続して、Dynamics 365・Dataverseのデータにアクセスできます。

f:id:sugimomoto:20210624094009p:plain

おわりに

Client Credentialのアプローチと違って、アプリケーションユーザーの作成が必要なく、わかりやすいですね。

ただ、Passwordをプログラムの中に入れないといけないので、その運用・管理には注意してください。

CData Driverで利用する上で不明な点があれば、お気軽にテクニカルサポートまでどうぞお問い合わせください。

https://www.cdata.com/jp/support/submit.aspx