使用On-Behalf-Of流调用MS Graph计量API时遇402错误求助
问题描述
我们正在调用需要启用计量的MS Graph API端点(例如assignSensitivityLabel),已按照文档创建了Microsoft.GraphServices/accounts资源。使用客户端凭据流调用时一切正常,但使用On-Behalf-Of(OBO)流时返回402 Payment Required错误。
两种流中,均传入应用ID作为client_id,并将范围设置为https://graph.microsoft.com/.default。
应用令牌声明:
{ "aud": "https://graph.microsoft.com/.default", "iss": "https://sts.windows.net/{tenantId}/", "idp": "https://sts.windows.net/{tenantId}/", "appid": "{applicationId}", "idtyp": "app", "roles": [ "Sites.Selected", "Sites.ReadWrite.All", "Mail.Send" ], "tid": "{tenandId}" }
用户令牌声明:
{ "aud": "https://graph.microsoft.com/.default", "iss": "https://sts.windows.net/{tenantId}/", "idp": "https://sts.windows.net/{tenantId}/", "appid": "{applicationId}", "idtyp": "user", "scp": "Group.Read.All Sites.ReadWrite.All Sites.Selected User.Read User.Read.All profile openid email", "tid": "{tenandId}" }
OBO流调用assignSensitivityLabel时的错误响应:
{ "error": { "code": "paymentRequired", "message": "Payment Required. Ensure that your application is able to call this premium API.For details see https://aka.ms/graph-metered-overview" } }
注:通过OBO流获取SharePoint API专用用户JWT,调用https://{tenantId}.sharepoint.com/_api/v2.1/drives/{driveId}/items/{itemId}/setSensitivityLabel时无错误。
解决方案
针对OBO流调用计量Graph API返回402的问题,可按以下步骤排查和解决:
- 确认委托权限配置:检查应用已添加
assignSensitivityLabel所需的委托权限(如Sites.ReadWrite.All或Files.ReadWrite.All),且租户管理员已完成权限同意。虽然用户令牌中已有Sites.ReadWrite.All,但需确保权限同意流程已正确完成,且权限范围覆盖目标API。 - 修正OBO令牌请求参数:在OBO交换令牌时,将
resource参数明确设置为https://graph.microsoft.com,而非带.default的格式;同时确保scope参数使用https://graph.microsoft.com/.default,保证请求的资源与计量配置匹配。 - 验证计量资源的用户上下文支持:检查
Microsoft.GraphServices/accounts资源的配置,确认其允许应用在用户上下文(OBO流)下调用计量API。部分计量配置默认仅支持应用上下文(客户端凭据),需调整配置以启用用户上下文场景。 - 检查OBO令牌的
azp声明:确认OBO获取的用户令牌中azp(授权方)字段与配置了计量资源的应用ID一致。若azp为其他应用ID,说明OBO流程中存在中间代理应用,需调整流程直接从用户令牌交换到Graph的令牌。 - 确认租户计量状态:验证租户已启用目标计量API,且
Microsoft.GraphServices/accounts资源已正确关联到租户,无配置错误(如资源名称、应用ID绑定错误)。
内容的提问来源于stack exchange,提问作者Valentyn Derkach
相关产品推荐
相关产品推荐

