からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

Microsoft Graph を使って Azure Active Directory のアプリケーションのアクセス許可の一覧を取得する

Microsoft Graph の beta バージョンでは Azure Active Directory のサービス プリンシパルおよび OAuth2 のアクセス許可に対する操作が可能になっています。これにより、例えば組織でどのアプリケーションがアクセス許可されているかを一覧で取得したり、アクセス許可の追加や削除を自動化することができるようになりました。今回は、組織のアプリケーションのアクセス許可の一覧を取得してみようと思います。

f:id:karamem0:20200420120651p:plain

事前準備

Azure Active Directory に新しいアプリケーションを登録します。Microsoft Graph に対して [Directory.Read.All] および [User.Read.All] アプリケーションのアクセス許可を付与します。

f:id:karamem0:20200420120720p:plain

サンプル コード

github.com

/oAuth2PermissionGrants のリクエストは ID しか返してくれないので、名前を取得するためには ID をキーに /servicePrincipals/{id} や /users/{id} を呼び出す必要があります。

実行結果

実行すると以下のような感じで結果が表示されます。ユーザーとして同意している場合はユーザー情報が入っており、組織として同意している場合はユーザー情報が入りません。同じアプリケーションでもアクセス許可の付与先のリソース ID が違う場合は別のレコードとして取得されます。なお、クライアント ID やリソース ID はアプリケーション ID ではなくオブジェクト ID になるので、注意が必要です。Azure ポータルの [エンタープライズ アプリケーション] ではオブジェクト ID で検索することはできないので、その点はちょっと不便ですね。

ClientId     : eaa3382b-3519-4a6a-9e54-c659292ed5ac
ClientName   : SharePoint Service Module for PowerShell Core
ResourceId   : 11721932-6e2d-43bf-af73-81bb24705aa8
ResourceName : Office 365 SharePoint Online
UserId       :
UserName     :
Scope        : AllSites.FullControl TermStore.ReadWrite.All User.Read.All

ClientId     : eaa3382b-3519-4a6a-9e54-c659292ed5ac
ClientName   : SharePoint Service Module for PowerShell Core
ResourceId   : aa466d19-3e79-47c1-b3c1-a271b3ddbceb
ResourceName : Microsoft Graph
UserId       :
UserName     :
Scope        : offline_access

ClientId     : 40808e79-5e1e-4735-8aa8-2bd7bf361988
ClientName   : Graph explorer
ResourceId   : aa466d19-3e79-47c1-b3c1-a271b3ddbceb
ResourceName : Microsoft Graph
UserId       : 4b34f1e2-0c77-4fbd-a8cf-94a4606021ee
UserName     : Takashi Shinohara
Scope        : openid profile User.ReadWrite User.ReadBasic.All Sites.ReadWrite.All Contacts.ReadWrite People.Read Notes.ReadWrite.All Tasks.ReadWrite Mail.ReadWrite Files.ReadWrite.All Calendars.ReadWrite Directory.ReadWrite.All

まとめ

Power Automate の承認フローと組み合わせるとアクセス許可の同意を自動化できます。組織として同意するのはグローバル管理者でしかできない操作ですが、アプリケーションのアクセス許可であればユーザーに関係なく同意ができるはずなので、かなり便利にになるのではないかと思います。