图 API 403 禁止 - scp 或角色声明需要出现在令牌中

Graph API 403 Forbidden - Either scp or roles claim need to be present in the token

我的应用在调用 Sharepoint /sites/root 时失败并显示 403:禁止消息。我的授权流程遵循这些步骤 here.

要获得令牌,我首先调用 https://login.microsoftonline.com/common/adminconsent?client_id=XXX&redirect_uri=XXX&state=12345

这让我可以通过管理员登录并发现 tenant_id。如果被接受,调用 returns 查询参数 admin_consent = TRUE 和 tenant_id.

然后我使用它对 https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token 进行第二次 POST 调用,请求中包含以下正文: client_id=XXX&grant_type=client_credentials&client_secret=XXX&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default

注意:范围设置为默认值 (https://graph.microsoft.com/.default)。我在注册应用程序时请求 Sites.ReadWrite.All 作为应用程序权限,仅此而已。

回复是:

'token_type': 'Bearer',
'expires_in': 3599,
'ext_expires_in': 3599,
'access_token': 'eyJ0...' (deliberately masked)

然后我尝试在带有 /sites/root 端点的应用程序中使用它并收到错误 'Either scp or roles claim need to be present in the token'。当我使用 https://jwt.io/#encoded-jwt 解码令牌时,我看不到 'roles' 参数可见。

在 Azure 应用程序中,我可以看到该应用程序确实已成功授予管理员访问权限,那么为什么我的令牌 return 不正确?我错过了什么?当然由用户 /adminconsent 作为第一个 API 调用我也不需要在 Azure 门户中手动授权吗?

编辑:在大约 50 分钟后进行第二次 API 调用以获取新令牌,因为第一个令牌即将过期似乎有效,我在解码令牌中得到了“角色”。图 api 是否存在导致此问题的错误?

"roles": [
    "Sites.ReadWrite.All"
],

Is there a bug on the graph api causing this issue?

不是bug,你做的都是对的,只是一个简单的延迟问题,请求token时权限没有生效