CData Software Blog

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

CData Office365 Driverが「アプリケーションのアクセス許可(ClientCredentials)」に対応しました

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

正式なリリースなWebSiteリリースはまだ先なのですが、Office365 Driverがアプリケーションのアクセス許可(ClientCredentials)方式によるリクエストをサポートしました!

どんなことができるの?

CData Office365 Driverでは予定表やメールデータの取得ができますが、基本的には最初の認証段階でOAuthプロセスのログインを行ったユーザーを軸としてデータの取得を行います。

例えば以下のようにEventsテーブルで予定データを取得したいよー、として実行するとログインユーザーの予定のみが取得されます。

f:id:sugimomoto:20190918231640p:plain

しかしながら、管理者ユーザーや組織分析を行いたいユーザーからすると、組織全体の予定データを横串で取得したい、といったシチュエーションがあるかと思います。

f:id:sugimomoto:20190918231646p:plain

そのボトルネックを解消することができる機能が今回実装された「アプリケーションのアクセス許可(ClientCredentials)」で可能になります!

どうやってやるの?

少しだけ技術的なポイントについて解説しておきます。詳しくは私の個人Blogの記事を参照してもらえるといいかなと思います。

CData Office365 Driver では、裏側の仕組みとして Microsoft GraphAPI を利用する Driver として開発されています。

Graph API は Azure AD の OAuthを通じてAPIに認証・権限の委任が行えるようになっており、その仕組は「委任されたアクセス許可」と「アプリケーションのアクセス許可」の2種類があります。

f:id:sugimomoto:20190918231653p:plain

今までの CData Driver では前者の「委任されたアクセス許可」のみがサポートされており、APIを通じて取得できるデータのスコープが狭い状態となっていました。

ざっとイメージだけお伝えすると、以下のように自分の予定

f:id:sugimomoto:20190918231700p:plain

もしくは、予め共有された予定だけが取得できる、という状態です。

f:id:sugimomoto:20190918231707p:plain

それが今回実装された「アプリケーションのアクセス許可」を行うと、特定ユーザーでアクセスするという識別が無くなり、組織全体ユーザーへのデータにアクセスが行えるようになります。

f:id:sugimomoto:20190918231716p:plain

もちろん、事前に管理者の許可が必要になりますので、一般ユーザーが簡単にどんなデータにでもアクセスできるようになる仕組みではありません。その点は安心してもらえればなと思います。

使い方

それでは実際に使い方を解説していきます。今回は前述しているイメージの通り、予定表のデータを横断的に取得するシナリオをベースに解説を進めますが、メールやファイルといった要素も同じアプローチになります。

途中の権限付与の部分を変更することで幅広く対応することが可能です。

なお、このプロセスを実行するためには Office365 管理者権限が必要となりますので、注意してください。

1. Azure AD にアプリケーション登録

まず、対象のOffice365 テナントにログインし、アプリケーション登録を行います。

「Azure Active Directory 管理センター」にアクセスし「Azure Active Directory」→「アプリの管理」から「+新規登録」をクリックします。

f:id:sugimomoto:20190918231723p:plain

任意のアプリケーション名を選択し、サポートされているアカウントの種類から「この組織ディレクトリのみに含まれるアカウント」を選択します。

ちなみに、この「サポートされているアカウントの種類」からマルチテナントシナリオを選択すると、生成したClientId・ClientSecretを用いた外部ユーザーが利用可能なアプリケーションの作成なども行えます。

併せてリダイレクトURLにも利用するアプリケーションを配置するサーバー・WebアプリケーションのURLを入力します。今回はローカルマシンから実行するだけなので、WEB http://localhost:33333 を指定しました。

f:id:sugimomoto:20190918231728p:plain

これで登録をクリックすればアプリケーション登録は完了です。

2. ClientIDの取得

まず、ClientIdを確認しておきましょう。アプリケーション登録後の「アプリケーション(クライアント)ID」と書かれている項目がClientId情報となります。

f:id:sugimomoto:20190918231736p:plain

3. ClientSecretの取得

次にClientSecretを取得します。アプリメニューから「証明書とシークレット」を選択し、「+新しいクライアントシークレット」をクリックします。

f:id:sugimomoto:20190918231745p:plain

任意の説明と有効期限を指定し、追加をクリックすれば

f:id:sugimomoto:20190918231753p:plain

以下のようにクライアントシークレットが生成されます。これもClientIdと一緒に控えておきます。

f:id:sugimomoto:20190918231800p:plain

4. API アクセス許可の付与

次に作成したアプリケーションにAPIアクセス許可を付与しましょう。このアクセス許可によって、どのデータにどういった操作が可能かを決定することができます。

メニューから「APIのアクセス許可」を選択し、「+アクセス許可の追加」をクリックします。

f:id:sugimomoto:20190918231808p:plain

各種Microsoft アプリケーションの一覧が表示されるので、真ん中あたりにある「Microsoft Graph」を選択し

f:id:sugimomoto:20190918231815p:plain

「アプリケーションの許可」を選択します。(ここは最近のAzure ADのアップデートによりUIがわかりやすくなりましたね)

f:id:sugimomoto:20190918231821p:plain

まず最低限必要となる「User.Read.All」にチェックを入れて

f:id:sugimomoto:20190918231831p:plain

予定を取得するために必要となる「Calendars.Read」を追加します。今回は書き込みも考慮して、「Calendars.ReadWrite」も付与しました。

ちなみにこの必要な付与情報はここで確認できます。

f:id:sugimomoto:20190918231839p:plain

あとは「アクセス許可の追加」をクリックすればOKです。

5. 管理者の同意を実施

最後にこのアクセス許可に対して、管理者の同意を取り付けます。この同意が無い限り、このアプリケーションはAPIを通じて対象の権限データにアクセスすることはできません。

以下のように「XXXX に管理者の同意を与えます」をクリックし、ダイアログのメッセージを確認の上「はい」をクリックします。

f:id:sugimomoto:20190918231845p:plain

すると、アクセス許可が付与されて、以下のように各アクセス許可の状態がグリーンになります。

f:id:sugimomoto:20190918231858p:plain

以上で Azure AD 側の準備は完了です。

6. CData Excel-Addin for Office365 を使って特定ユーザーの予定を取得してみる

それでは実際に取得した情報を使って CData Office365 Driver を使ってみましょう。

今回はわかりやすいように Excel Addinを使用しますが、ADO.NETJDBCODBC どれでも共通のアプローチになります。

以前から使っていた方はあらかじめ最新の Office365 Driver or Excel Addin をインストールしておきましょう。

まず、Excel を立ち上げて「取得元Office365」をクリックします。

f:id:sugimomoto:20190918231905p:plain

  • Tenant:対象のテナントドメイン(例:XXXXX.onmicrosoft.com)
  • OAuth Client Id:事前に取得したアプリケーション(クライアント)ID(例:34b87159-a67c-4549-b5f6-4620c8110c02)
  • OAuth Client Secret:事前に取得したクライアントシークレット(例:eHv.CCH83CGbTvy_.[qoyMweDiNIXj37)
  • CallbackURL:Azure AD アプリケーションで指定したリダイレクトURL(例:http://localhost:33333
  • OAuth Grant Type:CLIENTを選択

(なお、例として上げている値はわかりやすいように実際に私が取得した値としています。すでに削除していますのでアクセスできませんが。あしからず)

f:id:sugimomoto:20190918231911p:plain

あとは「接続テスト」をクリックして、成功すればOKです。「OK」をクリックして接続情報を保存しましょう。

7. Events データの取得

それでは実際に Events データを取得してみたいと思います。 Eventsテーブルを選択し、「UserId」の項目に対して、対象ユーザーに等しい値を取得するようにフィルターを設定します。ユーザーIDはメールアドレスでかまいません。

f:id:sugimomoto:20190918231923p:plain

すると以下のようにデータが取得できました!

f:id:sugimomoto:20190918231929p:plain

実際に対象ユーザーのカレンダーに登録されている予定データです。もちろん、このユーザー以外からも取得可能です。

f:id:sugimomoto:20190918231938p:plain

注意

ちなみに、何もユーザーIDを指定しないと、CData Driverはログインユーザーで予定を取りに行こうとします。通常の委任されたアクセス許可であれば問題無いのですが、アプリケーションのアクセス許可の場合、特定のユーザーを示さないため、以下のようなエラーが返ってきます。これは想定された仕様となりますので、ご注意ください。

f:id:sugimomoto:20190918231945p:plain

補足:アプリケーション実装者向け

ちなみに、Azure ADのアプリ登録プロセスで行った「管理者の同意」には特定のURLから実施が可能です。

CData Driverではマルチテナント向けシナリオとして、この管理者の同意URLがを生成することができるストアド・プロシージャが提供されています。

GetAdminConsentURL

以下のようなストアド・プロシージャで実行・取得ができます。

Execute GetAdminConsentURL CallbackUrl = 'http://localhost:33333', State = '1234';

もしマルチテナントアプリケーションを検討している場合は、是非活用してみてください。