はじめに
Microsoft Graph APIでアプリロールを取得していたのですが、特定のアプリロールが取得できず困ったので、解決策を簡単にまとめておきます。
使用言語はJavaScriptです。(ほかの言語でも同様かと思います)
また本記事ではアプリロールの説明や登録方法などは記載しません。
問題
ログイン中のユーザーのアプリロールの一覧を取得したかったので以下のように実装。
使用していたAPIは以下で、fetchAPIを使用して取得。
const response = await fetch("https://graph.microsoft.com/v1.0/me/appRoleAssignments");
アプリロールは返ってきているのですが、特定のアプリロールが入っていません。
原因が分からなかったのでSDKをインストールして試してみます。
Microsoft Graph SDKの導入
Microsoft Graph SDKを使用して確認してみます。
const client = Client.init({
authProvider: (done) => done(null, <access_token>)
});
let appRoleAssignments = await client.api('/me/appRoleAssignments')
.header('ConsistencyLevel','eventual')
.get();
ですが、結果は変わらず。
問題のあったユーザーはどれもアプリロールの数が多かったので、試しにフィルターをかけてみることに。
フィルターをかける
リソースIDでフィルターをかけられるようなので、そちらを試してみます。
const client = Client.init({
authProvider: (done) => done(null, <access_token>)
});
let appRoleAssignments = await client.api('/me/appRoleAssignments')
.header('ConsistencyLevel','eventual')
.filter('resourceId eq <resourcedId>')
.get();
アプリケーションにアプリロールを定義している場合は、アプリのオブジェクトIDがresourcedIdになります。
フィルターをかけて試してみたところ、取得したかったアプリロールが取得できました。なぜ?
結論
フィルターをかけることで取得できるようになりました。
詳しい原因はわかりませんが、問題が発生していたユーザーはアプリロールの数が多かった(フィルター前のレスポンスを数えてみたら96個もありました)ので、数が多かったのが問題だったのかなと思います。