Slide 1

Slide 1 text

© 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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

© 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

Slide 4

Slide 4 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 0. そもそも私は何をしている人か?

Slide 5

Slide 5 text

© 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種類ほど作ってる会社

Slide 6

Slide 6 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp Motion Boardの中でも使われてます https://www.wingarc.com/product/motionboard/mb60/

Slide 7

Slide 7 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp Office365 Driver・コネクタも提供中 https://www.cdata.com/jp/drivers/office365/

Slide 8

Slide 8 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp デモ

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 1. 今日のセッションのゴール

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 2種類のアクセス許可をちゃんと理解して 適切なアクセス許可を実現できるようになろう! 委任されたアクセス許可 アプリケーションのアクセス許可

Slide 13

Slide 13 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 2. どんな問題に遭遇したのか?

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp で、何かBIツール的なもので分析したい https://www.wingarc.com/product/motionboard/mb60/

Slide 17

Slide 17 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp でも、なんか「Access is denied」とか エラーが出るらしい……

Slide 18

Slide 18 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp どうせぱーみっしょん不足してるんやろ

Slide 19

Slide 19 text

© 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指定 をすればいいんだな!

Slide 20

Slide 20 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp Graph エクスプローラーで叩く アクセス許可入れて~ /users/{id | userPrincipalName}/events でアクセス!

Slide 21

Slide 21 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 通らない! Code:DelegatedCalendarAccessDenied Message:Access is denied. Check credentials and try again.

Slide 22

Slide 22 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp なぜ!? 必要なアクセス許可 つけたやん URL間違ってないじゃん 自分の予定は 取れるじゃん しかも管理者ユーザー なのに

Slide 23

Slide 23 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp なぜ通らなかったのか? 今日はここの課題をベースにしながら Graph のアクセス許可の仕組みを解説していきます。

Slide 24

Slide 24 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 3. アクセス許可は「2種類」あることを理解する

Slide 25

Slide 25 text

© 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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 具体的に何が違ってるの?

Slide 28

Slide 28 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp ログインの要否と明示的なアクセスユーザーの存在 委任されたアクセス許可 アプリケーションのアクセス許可 ユーザーがAPIを利用する前に ログインと委任が必要 APIを利用する前に許可済みだ から、ログインが不要 管理者が予め許可をしている

Slide 29

Slide 29 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 大事なことは ユーザーが軸になっているかなっていないか

Slide 30

Slide 30 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp だからアクセス許可の種類で 権限の範囲が変わってしまう 適切なアクセス許可を設定したつもりが、取得できない データが存在してしまう

Slide 31

Slide 31 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 4. どんな感じでアクセス許可を設定すればいいのか?

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

© 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 どのデータにアクセスするか どの範囲までアクセスするか どんな操作をするか

Slide 34

Slide 34 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp ただし例外もある このあたりとか このあたりとか

Slide 35

Slide 35 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp このイメージの上で 今回のユースケースを見てみる Calendars.Read Calendars.Read.Shared Calendars.Read All

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp ユーザーを軸としてデータを取得したいなら 「委任されたアクセス許可」 組織・全体を軸としてデータを取得したいなら 「アプリケーションのアクセス許可」 ユースケースに応じて それぞれを使い分ける必要がある (※もちろんこれは一例)

Slide 40

Slide 40 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp では、なぜ前述の問題が発生したのか? 制約は「Calender.ReadAndWrite All」を付与していたが、 アクセス方法は「委任されたアクセス許可」だったから!

Slide 41

Slide 41 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp Graph エクスプローラーでは 以下のリンクをクリックして設定を行う必要があった

Slide 42

Slide 42 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp というわけで それぞれのアクセス許可を試してみよう

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp Azure ADのアプリ登録へ移動

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp アクセス許可の種類を選択! ポイントはここ! 最新のAzure AD UIだとめちゃくちゃわかりやすい

Slide 51

Slide 51 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 必要なアクセス許可を追加

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

© 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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

© 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

Slide 56

Slide 56 text

© 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..." }

Slide 57

Slide 57 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 7. アプリケーションのアクセス許可

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

© 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

Slide 61

Slide 61 text

© 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は含まれない。 「アプリケーションのアクセス許可」の場合、 同意と後続のプロセスは独立した形になる。

Slide 62

Slide 62 text

© 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

Slide 63

Slide 63 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 3. Access Token を取得 { "token_type": "Bearer", "expires_in": 3599, "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1..." }

Slide 64

Slide 64 text

© 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 を除く) に同意する権限を付与します。 このロールに割り当てられたユーザー は、新しいアプリケーション登録またはエンタープライズ アプリケーションを作成する際に、 所有者として追加されません。

Slide 65

Slide 65 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 補足:「管理者」とは何か? アプリケーション管理者の ロールを持つユーザー

Slide 66

Slide 66 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 補足:「管理者」とは何か? もしくは Office365 全体管理者でもOK

Slide 67

Slide 67 text

© 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 が実施可能! (バッチ処理ユーザーとかを別途作らなく て済む。ライセンスも節約できる!)

Slide 68

Slide 68 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 8. まとめ

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

© 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 どのデータにアクセスするか どの範囲までアクセスするか どんな操作をするか

Slide 71

Slide 71 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 9. 余談

Slide 72

Slide 72 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp 実は対応していなかった CData Office365 Driver GranType [Code]にしか対応していなかった… (Authrization Code)

Slide 73

Slide 73 text

© 2018 CData Software Japan, LLC | www.cdata.com/jp ですが、8月のリリースで正式に対応しました! https://www.cdatablog.jp/entry/2019/09/19/105417

Slide 74

Slide 74 text

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