Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Office365 Graph で2種類のアクセス許可の仕様にハマった話 #o365jp

Office365 Graph で2種類のアクセス許可の仕様にハマった話 #o365jp

[Session Title]
Office365 Graph で2種類のアクセス許可の仕様にハマった話

[Event Info]
第25回 Office 365 勉強会:Microsoft Graph API https://jpo365ug.connpass.com/event/142896/

[Sumally]
Graph APIを使うにあたって、OAuthを使ったアクセストークンの取得は必須の基礎的部分ですが、アクセストークンは取得できても、アクセス範囲やアクセス許可のアプローチについては、なんだかよくわからない、ということも多いのではないでしょうか。

このセッションでは私自身が躓いた予定表のデータを横断的に取得したいといったシナリオをベースにしながら、Office365 Graph における2種類のアクセス許可の仕様と捉え方、考え方を解説していきます。

[Blog Article]
このセッションの内容は以下のBlog記事でも詳しく書いています。併せて参照してみてください。

Morning Girl:Office365 GraphAPI で認証アプローチ毎のアクセス範囲にハマった話 ユーザーの予定(Event)を横断的に取得したい! 
http://kageura.hatenadiary.jp/entry/2019/04/22/Office365_GraphAPI_%E3%81%A7%E8%AA%8D%E8%A8%BC%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%E6%AF%8E%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E7%AF%84%E5%9B%B2%E3%81%AB%E3%83%8F%E3%83%9E%E3%81%A3#%E3%82%84%E3%82%8A%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8

CData Software Japan Blog: CData Office365 Driverが「アプリケーションのアクセス許可(ClientCredentials)」に対応しました
https://www.cdatablog.jp/entry/2019/09/19/105417

Kazuya Sugimoto

September 25, 2019
Tweet

More Decks by Kazuya Sugimoto

Other Decks in Technology

Transcript

  1. © 2018 CData Software Japan, LLC | www.cdata.com/jp Office365 Graph

    で2種類のアクセス許可の仕様にハマった話 2019/09/25 第25回 Office 365 勉強会:Microsoft Graph API CData Software Japan Kazuya Sugimoto -Lead Engineer
  2. © 2018 CData Software Japan, LLC | www.cdata.com/jp 杉本 和也:Kazuya

    Sugimoto CData Software Japan, LLC Lead Engineer Microsoft MVP for Business Applications (Dynamics CRM/365) 普段は仕事でも趣味でもひたすらWeb APIを触っているWeb API Horic 今まで100種類くらいのサービスのWeb APIを見たり触ったりしてる(たぶん) Blog:Morning Girl http://kageura.hatenadiary.jp/ Twitter:@sugimomoto Facebook:sugimomoto
  3. © 2018 CData Software Japan, LLC | www.cdata.com/jp CData Software

    Japan Bi-directional Access to Live App, Database, & Web API Data Through Standard Drivers APIやNoSQLのドライバーを150種類ほど作ってる会社
  4. © 2018 CData Software Japan, LLC | www.cdata.com/jp 今日はそんな Office365

    コネクタ・Driver の テクニカルサポートをしていて 実際に遭遇した「躓き」が元になっています。
  5. © 2018 CData Software Japan, LLC | www.cdata.com/jp Azure AD

    アプリのアクセス許可 普段よくわからず設定していませんか? ※最新のAzure ADアプリ画面だとわかりやすくなったけどね!
  6. © 2018 CData Software Japan, LLC | www.cdata.com/jp ユーザーはこれがやりたかった ユーザーA

    予定表 Multi Users Case ユーザーB 予定表 ユーザーC 予定表 Graph API で 複数ユーザーの予定表を 横串で取得したい! 最終的には横串で取得して分析したい ・営業活動頻度 ・会議頻度 ・対顧客別専有時間
  7. © 2018 CData Software Japan, LLC | www.cdata.com/jp Reference を見る

    https://docs.microsoft.com/ja-jp/graph/api/user-list-events?view=graph-rest-1.0&tabs=http#permissions なるほど。この権限を設定し て~ users リソースURLでID指定 をすればいいんだな!
  8. © 2018 CData Software Japan, LLC | www.cdata.com/jp Graph エクスプローラーで叩く

    アクセス許可入れて~ /users/{id | userPrincipalName}/events でアクセス!
  9. © 2018 CData Software Japan, LLC | www.cdata.com/jp なぜ!? 必要なアクセス許可

    つけたやん URL間違ってないじゃん 自分の予定は 取れるじゃん しかも管理者ユーザー なのに
  10. © 2018 CData Software Japan, LLC | www.cdata.com/jp 少しだけおさらい。Graph のアクセストークン取得手順

    1. Azure AD にアプリを登録 2. Graph のアクセス許可 3. アクセストークンの取得 https://docs.microsoft.com/ja-jp/graph/auth/auth-concepts
  11. © 2018 CData Software Japan, LLC | www.cdata.com/jp ポイントは「2種類」のアクセス許可 委任されたアクセス許可

    アプリケーションのアクセス許可 明示的なサインインユーザーが存在する場合に利用 するアプローチ エンドユーザーが利用するスマホアプリ等、サインイン ユーザーとして動作することが必要なアプリで利用 サインインしているユーザーが存在しないアプリで利 用するアプローチ バックグラウンド サービスやデーモンなどのアプリで 利用
  12. © 2018 CData Software Japan, LLC | www.cdata.com/jp ログインの要否と明示的なアクセスユーザーの存在 委任されたアクセス許可

    アプリケーションのアクセス許可 ユーザーがAPIを利用する前に ログインと委任が必要 APIを利用する前に許可済みだ から、ログインが不要 管理者が予め許可をしている
  13. © 2018 CData Software Japan, LLC | www.cdata.com/jp だからアクセス許可の種類で 権限の範囲が変わってしまう

    適切なアクセス許可を設定したつもりが、取得できない データが存在してしまう
  14. © 2018 CData Software Japan, LLC | www.cdata.com/jp ざっくりとアクセス許可を捉える Graph

    APIのアクセス許可は「リソース:操作:範囲」の3つで捉えるのが個 人的におすすめ ・リソースは「Event、File」など、どんなデータにアクセスするのか ・操作は「Read、Write」など、データに対してどんな処理を行うのか ・範囲は「All、Shared、None」など、どの範囲までアクセスするのか ※Allアプリケーションのアクセス許可によって明示的に指定しない場合もある
  15. © 2018 CData Software Japan, LLC | www.cdata.com/jp 「リソース:操作:範囲」のイメージ リソース

    Event Directory File Group 操作 Read All All All All Shared Shared Shared Shared None None None None ReadWrite All All All All Shared Shared Shared Shared None None None None どのデータにアクセスするか どの範囲までアクセスするか どんな操作をするか
  16. © 2018 CData Software Japan, LLC | www.cdata.com/jp None(範囲の指定無し)ケース Calendars.Read

    ユーザーA 予定表 ユーザーB 予定表 ユーザーC 予定表 委任されたアクセス許可 アプリケーションのアクセス許可 ユーザーD 予定表 ユーザーE 予定表 Calendars.Read の場合 ログインしているユーザー自身の 予定表にしかアクセスできない ☓ ユーザーを特定できないので、 アクセスできない
  17. © 2018 CData Software Japan, LLC | www.cdata.com/jp Sharedケース Calendars.Read.Shared

    ユーザーA 予定表 ユーザーB 予定表 ユーザーC 予定表 委任されたアクセス許可 アプリケーションのアクセス許可 ユーザーD 予定表 ユーザーE 予定表 Calendars.Read.Shared の場 合、共有されている予定表まで アクセスが可能 ※あらかじめ共有してもらう必要あり 共有 共有 ☓ ユーザーを特定できないので、 アクセスできない
  18. © 2018 CData Software Japan, LLC | www.cdata.com/jp All ケース

    Calendars.Read All ユーザーA 予定表 ユーザーB 予定表 ユーザーC 予定表 委任されたアクセス許可 アプリケーションのアクセス許可 ユーザーD 予定表 ユーザーE 予定表 アプリケーションアクセス許可で Calendars.Read の場合、 共有やユーザーに関係無く、すべて の予定にアクセスが可能 共有 共有 ☓ 委任されたアクセス許可アプリは アプリケーションアクセス許可 の 権限でアクセスができない。
  19. © 2018 CData Software Japan, LLC | www.cdata.com/jp ユーザーを軸としてデータを取得したいなら 「委任されたアクセス許可」

    組織・全体を軸としてデータを取得したいなら 「アプリケーションのアクセス許可」 ユースケースに応じて それぞれを使い分ける必要がある (※もちろんこれは一例)
  20. © 2018 CData Software Japan, LLC | www.cdata.com/jp では、なぜ前述の問題が発生したのか? 制約は「Calender.ReadAndWrite

    All」を付与していたが、 アクセス方法は「委任されたアクセス許可」だったから!
  21. © 2018 CData Software Japan, LLC | www.cdata.com/jp Graph エクスプローラーでは

    以下のリンクをクリックして設定を行う必要があった
  22. © 2018 CData Software Japan, LLC | www.cdata.com/jp 5. Azure

    AD へアプリケーションの登録(共通)
  23. © 2018 CData Software Japan, LLC | www.cdata.com/jp 1. Authorization

    URL の作成 以下のURLを生成して、ログイン要求を行う。 GET https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize? client_id=6731de76-14a6-49ae-97bc-6eba6914391e &response_type=code &redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F &response_mode=query &scope=offline_access%20user.read%20mail.read &state=12345
  24. © 2018 CData Software Japan, LLC | www.cdata.com/jp 2. ログイン要求を実施

    以下のレスポンスを取得 https://localhost/myapp/? code=M0ab92efe-b6fd-df08-87dc- 2c6500a7f84d &state=12345
  25. © 2018 CData Software Japan, LLC | www.cdata.com/jp 3. Access

    Token を要求 POST https://login.microsoftonline.com/common/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id=6731de76-14a6-49ae-97bc-6eba6914391e &scope=user.read%20mail.read &code=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3 n8b2JRLk4OxVXr... &redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F &grant_type=authorization_code &client_secret=JqQX2PNo9bpM0uEihUPzyrh
  26. © 2018 CData Software Japan, LLC | www.cdata.com/jp 4. Access

    Token を取得 { "token_type": "Bearer", "scope": "user.read%20Fmail.read", "expires_in": 3600, "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1d..", "refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGU..." }
  27. © 2018 CData Software Japan, LLC | www.cdata.com/jp アプリケーションのアクセス許可は管理者の同意が必要 実施方法は2種類ある

    ・Azure AD アプリ画面から管理者の同意を行う方法 ・Adminconsent エンドポイントで管理者の同意を行う方法 ※補足 前者は管理者がAzure ADアプリにログインして行う必要がある。 後者はマルチテナント用アプリケーション等が自動的に生成して、要求を 取り付けることが可能。
  28. © 2018 CData Software Japan, LLC | www.cdata.com/jp 1-A. Azure

    AD アプリ画面から管理者の同意
  29. © 2018 CData Software Japan, LLC | www.cdata.com/jp 1-B. Adminconsent

    エンドポイントで管理者の同意 以下のURLを生成して、ログイン要求を行う。 GET https://login.microsoftonline.com/{tenant}/adminconsent ?client_id=6731de76-14a6-49ae-97bc-6eba6914391e &state=12345 &redirect_uri=https://localhost/myapp/permissions
  30. © 2018 CData Software Japan, LLC | www.cdata.com/jp 1-B. Adminconsent

    エンドポイントで管理者の同意 以下のレスポンスを取得 https://localhost/myapp/permissions ?tenant=a8990e1f-ff32-408a-9f8e- 78d3b9139b95&state=12345 &admin_consent=True 「委任されたアクセス許可」であったような Codeは含まれない。 「アプリケーションのアクセス許可」の場合、 同意と後続のプロセスは独立した形になる。
  31. © 2018 CData Software Japan, LLC | www.cdata.com/jp 2. Access

    Token を要求 POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token HTTP/1.1 Host: login.microsoftonline.com Content-Type: application/x-www-form-urlencoded client_id=535fb089-9ff3-47b6-9bfb-4f1264799865 &scope=https%3A%2F%2Fgraph.microsoft.com%2F.default &client_secret=qWgdYAmab0YSkuL1qKv5bPX &grant_type=client_credentials
  32. © 2018 CData Software Japan, LLC | www.cdata.com/jp 3. Access

    Token を取得 { "token_type": "Bearer", "expires_in": 3599, "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1..." }
  33. © 2018 CData Software Japan, LLC | www.cdata.com/jp 補足:「管理者」とは何か? Azure

    AD ロールの 「アプリケーション管理者(全体管理者でももちろんOK)」のこと https://docs.microsoft.com/ja-jp/azure/active-directory/users-groups-roles/directory-assign-admin-roles アプリケーション管理者:このロールのユーザーは、エンタープライズ アプリケーション、アプ リケーション登録、アプリケーション プロキシの設定の全側面を作成して管理できます。 さら に、このロールは、委任されたアクセス許可とアプリケーション アクセス許可 (Microsoft Graph と Azure AD Graph を除く) に同意する権限を付与します。 このロールに割り当てられたユーザー は、新しいアプリケーション登録またはエンタープライズ アプリケーションを作成する際に、 所有者として追加されません。
  34. © 2018 CData Software Japan, LLC | www.cdata.com/jp 補足②:PowerApps CDS/Dynamics

    365 の場合 https://docs.microsoft.com/ja-jp/powerapps/developer/common-data- service/authenticate-oauth#common-data-service-user-account-bound-to-the- registered-app アプリケーションユーザーを作成することで、 client_credentials が実施可能! (バッチ処理ユーザーとかを別途作らなく て済む。ライセンスも節約できる!)
  35. © 2018 CData Software Japan, LLC | www.cdata.com/jp ポイントは「2種類」のアクセス許可 委任されたアクセス許可

    アプリケーションのアクセス許可 明示的なサインインユーザーが存在する場合に利用 するアプローチ エンドユーザーが利用するスマホアプリ等、サインイン ユーザーとして動作することが必要なアプリで利用 サインインしているユーザーが存在しないアプリで利 用するアプローチ バックグラウンド サービスやデーモンなどのアプリで 利用
  36. © 2018 CData Software Japan, LLC | www.cdata.com/jp 「リソース:操作:範囲」を意識して 適切なアクセス許可を実施しよう

    リソース Event Directory File Group 操作 Read All All All All Shared Shared Shared Shared None None None None ReadWrite All All All All Shared Shared Shared Shared None None None None どのデータにアクセスするか どの範囲までアクセスするか どんな操作をするか
  37. © 2018 CData Software Japan, LLC | www.cdata.com/jp 実は対応していなかった CData

    Office365 Driver GranType [Code]にしか対応していなかった… (Authrization Code)