この記事では、Microsoft Graph で /me
エンドポイントを呼び出すと、NoPermissionsInAccessToken
エラー メッセージが表示される問題について説明します。 また、この記事では、クライアント資格情報付与フローを通じて取得されたトークンを使用して /me
エンドポイントを呼び出せない理由についても説明します。
症状
クライアント資格情報付与フローを使用する Microsoft Entra ID ベースのアプリケーションから/me
エンドポイントを呼び出そうとすると、次のエラー メッセージが表示されます。
{
"error": {
"code": "NoPermissionsInAccessToken",
"message": "The token contains no permissions, or permissions can not be understood.",
"innerError": {
"oAuthEventOperationId": "48f66de9-xxx-xxxx1-xxxx-399ea6608ec0",
"oAuthEventcV": "MkVd0xxxxxvjGFVJkoA.1",
"errorUrl": "https://aka.ms/autherrors#error-InvalidGrant",
"requestId": "80f8a0e9-xxxx-xxxx-xxxx-88e5d4bb5bb2",
"date": "2021-07-30T04:04:38"
}
}
}
原因
/me
エンドポイントは、サインインしているユーザーが自分の情報を取得できるように設計されています。
/me
エンドポイントを呼び出すには、エンドポイントが委任されたアクセス許可を使用するため、ユーザー コンテキストを指定する必要があります。 つまり、クライアント資格情報付与フローを使用して生成されたトークンは、ユーザー コンテキスト情報がないため、 /me
エンドポイントを使用できません。
クライアント資格情報付与フローを使用して取得されたトークンは、ユーザー ID ではなくアプリケーション ID を表します。 これらのトークンには、委任されたアクセス許可の scp (スコープ) 要求ではなく、アプリケーションのアクセス許可に対する ロール 要求が含まれています。 ユーザー コンテキストがないと、 /me
エンドポイントが要求に関連付けられているユーザーを特定できなくなります。
トークンの例
ユーザー コンテキストを持つトークン (ユーザーがサインインした委任されたフロー)
このトークンは、ユーザーがサインインした委任されたフローを使用して付与されます。 これには、ユーザー固有の情報と、現在のユーザーのアクセス許可を含む scp
要求が含まれます。
アプリケーション ID を持つトークン (client_credentials許可フロー)
このトークンは、クライアント資格情報付与フローを使用して生成されます。 ユーザー固有の情報は含まれません。 代わりに、アプリケーションのアクセス許可の roles
要求が含まれています。
解決策
アプリケーションでクライアント資格情報付与フローを使用する場合は、/me
エンドポイントではなく、/users
エンドポイントを使用する必要があります。
/users
エンドポイントを使用すると、アプリケーション トークンを使用してユーザー固有の情報を取得できます。
たとえば、 GET https://graph.microsoft.com/v1.0/me/memberOf
を呼び出して、ユーザーがメンバーになっているグループの一覧を生成する場合は、次のメソッドを使用します。
- クライアント資格情報付与フローを使用してアプリケーション トークンを取得します。
- アプリケーションに、ユーザー情報を照会するための User.Read.All アクセス許可があることを確認します。
-
ユーザー エンドポイントを使用して、特定のユーザーの詳細を照会します。 {upn} を、ユーザーのユーザー プリンシパル名 (UPN) またはユーザー オブジェクト ID に置き換えます。
GET https://graph.microsoft.com/v1.0/users/{upn or userID}/memberOf
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。