You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用授权码获取其他微软账户access_token遇租户匹配等问题求助

问题解决:通过自有应用访问第三方微软账户的MS Graph API

核心问题

自有应用需访问其他微软账户用户的MS Graph API,无需客户自行创建应用。当前已通过common端点获取用户授权的authorization code,但遇到两个问题:

  1. 二次调用使用同一授权码时,报错:OAuth2 Authorization code was already redeemed, please retry with a new valid code or use an existing refresh token.
  2. 使用自身tenantId的token端点兑换授权码时,报错:Provided Authorization Code is intended to use against other tenant, thus rejected.
    仅知晓自身clientId、tenantId和密钥,不清楚客户的tenantId。

错误原因

  • 授权码为一次性凭证,兑换访问令牌后即失效,无法重复使用。
  • 从common端点获取的授权码属于客户的租户,无法用自身tenantId的端点进行兑换。

分步解决方案

1. 正确兑换授权码获取令牌(含刷新令牌)

使用common的token端点进行兑换,无需知晓客户tenantId:

POST https://login.microsoftonline.com/common/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

client_id=<你的clientId>
&client_secret=<你的密钥>
&code=<用户授权的authorization code>
&redirect_uri=<你的redirectURI>
&grant_type=authorization_code

调用成功后,会返回包含access_token(访问令牌)、refresh_token(刷新令牌)、expires_in(令牌有效期)的响应。

2. 使用刷新令牌获取新的访问令牌

当access_token过期后,无需重新获取授权码,直接用refresh_token向common端点请求新的访问令牌:

POST https://login.microsoftonline.com/common/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

client_id=<你的clientId>
&client_secret=<你的密钥>
&refresh_token=<之前获取的refresh_token>
&grant_type=refresh_token
&scope=User.Read.All  # 可选,需与授权时的scope一致

3. 调用MS Graph API

使用获取到的access_token调用目标API,例如:

GET https://graph.microsoft.com/v1.0/me
Authorization: Bearer <access_token>

关键注意事项

  • 应用注册时需将账户类型设置为任何组织目录中的账户和个人Microsoft账户,确保common端点可正常使用。
  • 授权码有效期仅约10分钟,需在有效期内完成兑换。
  • refresh_token需妥善存储,若用户撤销授权或令牌过期,需重新引导用户获取授权码。
  • 若需访问租户级数据(如User.Read.All对应的全租户用户列表),需确保用户具备对应权限,或为应用申请管理员同意的权限。

内容的提问来源于stack exchange,提问作者user2393383

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:52:57