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

86e4f6731e81df0591bd9cb66ddbd347?s=47 Kazuya Sugimoto
September 25, 2019

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

86e4f6731e81df0591bd9cb66ddbd347?s=128

Kazuya Sugimoto

September 25, 2019
Tweet

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 本日の資料 bit.ly/O365JPCDATA

  3. © 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
  4. © 2018 CData Software Japan, LLC | www.cdata.com/jp 0. そもそも私は何をしている人か?

  5. © 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種類ほど作ってる会社
  6. © 2018 CData Software Japan, LLC | www.cdata.com/jp Motion Boardの中でも使われてます

    https://www.wingarc.com/product/motionboard/mb60/
  7. © 2018 CData Software Japan, LLC | www.cdata.com/jp Office365 Driver・コネクタも提供中

    https://www.cdata.com/jp/drivers/office365/
  8. © 2018 CData Software Japan, LLC | www.cdata.com/jp デモ

  9. © 2018 CData Software Japan, LLC | www.cdata.com/jp 今日はそんな Office365

    コネクタ・Driver の テクニカルサポートをしていて 実際に遭遇した「躓き」が元になっています。
  10. © 2018 CData Software Japan, LLC | www.cdata.com/jp 1. 今日のセッションのゴール

  11. © 2018 CData Software Japan, LLC | www.cdata.com/jp Azure AD

    アプリのアクセス許可 普段よくわからず設定していませんか? ※最新のAzure ADアプリ画面だとわかりやすくなったけどね!
  12. © 2018 CData Software Japan, LLC | www.cdata.com/jp 2種類のアクセス許可をちゃんと理解して 適切なアクセス許可を実現できるようになろう!

    委任されたアクセス許可 アプリケーションのアクセス許可
  13. © 2018 CData Software Japan, LLC | www.cdata.com/jp 2. どんな問題に遭遇したのか?

  14. © 2018 CData Software Japan, LLC | www.cdata.com/jp こんな予定ありますよね

  15. © 2018 CData Software Japan, LLC | www.cdata.com/jp ユーザーはこれがやりたかった ユーザーA

    予定表 Multi Users Case ユーザーB 予定表 ユーザーC 予定表 Graph API で 複数ユーザーの予定表を 横串で取得したい! 最終的には横串で取得して分析したい ・営業活動頻度 ・会議頻度 ・対顧客別専有時間
  16. © 2018 CData Software Japan, LLC | www.cdata.com/jp で、何かBIツール的なもので分析したい https://www.wingarc.com/product/motionboard/mb60/

  17. © 2018 CData Software Japan, LLC | www.cdata.com/jp でも、なんか「Access is

    denied」とか エラーが出るらしい……
  18. © 2018 CData Software Japan, LLC | www.cdata.com/jp どうせぱーみっしょん不足してるんやろ

  19. © 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指定 をすればいいんだな!
  20. © 2018 CData Software Japan, LLC | www.cdata.com/jp Graph エクスプローラーで叩く

    アクセス許可入れて~ /users/{id | userPrincipalName}/events でアクセス!
  21. © 2018 CData Software Japan, LLC | www.cdata.com/jp 通らない! Code:DelegatedCalendarAccessDenied

    Message:Access is denied. Check credentials and try again.
  22. © 2018 CData Software Japan, LLC | www.cdata.com/jp なぜ!? 必要なアクセス許可

    つけたやん URL間違ってないじゃん 自分の予定は 取れるじゃん しかも管理者ユーザー なのに
  23. © 2018 CData Software Japan, LLC | www.cdata.com/jp なぜ通らなかったのか? 今日はここの課題をベースにしながら

    Graph のアクセス許可の仕組みを解説していきます。
  24. © 2018 CData Software Japan, LLC | www.cdata.com/jp 3. アクセス許可は「2種類」あることを理解する

  25. © 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
  26. © 2018 CData Software Japan, LLC | www.cdata.com/jp ポイントは「2種類」のアクセス許可 委任されたアクセス許可

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

  28. © 2018 CData Software Japan, LLC | www.cdata.com/jp ログインの要否と明示的なアクセスユーザーの存在 委任されたアクセス許可

    アプリケーションのアクセス許可 ユーザーがAPIを利用する前に ログインと委任が必要 APIを利用する前に許可済みだ から、ログインが不要 管理者が予め許可をしている
  29. © 2018 CData Software Japan, LLC | www.cdata.com/jp 大事なことは ユーザーが軸になっているかなっていないか

  30. © 2018 CData Software Japan, LLC | www.cdata.com/jp だからアクセス許可の種類で 権限の範囲が変わってしまう

    適切なアクセス許可を設定したつもりが、取得できない データが存在してしまう
  31. © 2018 CData Software Japan, LLC | www.cdata.com/jp 4. どんな感じでアクセス許可を設定すればいいのか?

  32. © 2018 CData Software Japan, LLC | www.cdata.com/jp ざっくりとアクセス許可を捉える Graph

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

    このあたりとか
  35. © 2018 CData Software Japan, LLC | www.cdata.com/jp このイメージの上で 今回のユースケースを見てみる

    Calendars.Read Calendars.Read.Shared Calendars.Read All
  36. © 2018 CData Software Japan, LLC | www.cdata.com/jp None(範囲の指定無し)ケース Calendars.Read

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

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

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

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

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

    以下のリンクをクリックして設定を行う必要があった
  42. © 2018 CData Software Japan, LLC | www.cdata.com/jp というわけで それぞれのアクセス許可を試してみよう

  43. © 2018 CData Software Japan, LLC | www.cdata.com/jp 5. Azure

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

  45. © 2018 CData Software Japan, LLC | www.cdata.com/jp アプリケーションの登録

  46. © 2018 CData Software Japan, LLC | www.cdata.com/jp Client Id(アプリケーションID)の取得

  47. © 2018 CData Software Japan, LLC | www.cdata.com/jp Client Secret

    の取得
  48. © 2018 CData Software Japan, LLC | www.cdata.com/jp アクセス許可の追加

  49. © 2018 CData Software Japan, LLC | www.cdata.com/jp Microsoft Graph

    の選択
  50. © 2018 CData Software Japan, LLC | www.cdata.com/jp アクセス許可の種類を選択! ポイントはここ!

    最新のAzure AD UIだとめちゃくちゃわかりやすい
  51. © 2018 CData Software Japan, LLC | www.cdata.com/jp 必要なアクセス許可を追加

  52. © 2018 CData Software Japan, LLC | www.cdata.com/jp 6. 委任されたアクセス許可

  53. © 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
  54. © 2018 CData Software Japan, LLC | www.cdata.com/jp 2. ログイン要求を実施

    以下のレスポンスを取得 https://localhost/myapp/? code=M0ab92efe-b6fd-df08-87dc- 2c6500a7f84d &state=12345
  55. © 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
  56. © 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..." }
  57. © 2018 CData Software Japan, LLC | www.cdata.com/jp 7. アプリケーションのアクセス許可

  58. © 2018 CData Software Japan, LLC | www.cdata.com/jp アプリケーションのアクセス許可は管理者の同意が必要 実施方法は2種類ある

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

    AD アプリ画面から管理者の同意
  60. © 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
  61. © 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は含まれない。 「アプリケーションのアクセス許可」の場合、 同意と後続のプロセスは独立した形になる。
  62. © 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
  63. © 2018 CData Software Japan, LLC | www.cdata.com/jp 3. Access

    Token を取得 { "token_type": "Bearer", "expires_in": 3599, "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1..." }
  64. © 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 を除く) に同意する権限を付与します。 このロールに割り当てられたユーザー は、新しいアプリケーション登録またはエンタープライズ アプリケーションを作成する際に、 所有者として追加されません。
  65. © 2018 CData Software Japan, LLC | www.cdata.com/jp 補足:「管理者」とは何か? アプリケーション管理者の

    ロールを持つユーザー
  66. © 2018 CData Software Japan, LLC | www.cdata.com/jp 補足:「管理者」とは何か? もしくは

    Office365 全体管理者でもOK
  67. © 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 が実施可能! (バッチ処理ユーザーとかを別途作らなく て済む。ライセンスも節約できる!)
  68. © 2018 CData Software Japan, LLC | www.cdata.com/jp 8. まとめ

  69. © 2018 CData Software Japan, LLC | www.cdata.com/jp ポイントは「2種類」のアクセス許可 委任されたアクセス許可

    アプリケーションのアクセス許可 明示的なサインインユーザーが存在する場合に利用 するアプローチ エンドユーザーが利用するスマホアプリ等、サインイン ユーザーとして動作することが必要なアプリで利用 サインインしているユーザーが存在しないアプリで利 用するアプローチ バックグラウンド サービスやデーモンなどのアプリで 利用
  70. © 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 どのデータにアクセスするか どの範囲までアクセスするか どんな操作をするか
  71. © 2018 CData Software Japan, LLC | www.cdata.com/jp 9. 余談

  72. © 2018 CData Software Japan, LLC | www.cdata.com/jp 実は対応していなかった CData

    Office365 Driver GranType [Code]にしか対応していなかった… (Authrization Code)
  73. © 2018 CData Software Japan, LLC | www.cdata.com/jp ですが、8月のリリースで正式に対応しました! https://www.cdatablog.jp/entry/2019/09/19/105417

  74. © 2018 CData Software Japan, LLC | www.cdata.com/jp 本日の資料 bit.ly/O365JPCDATA