使用授权码获取其他微软账户access_token遇租户匹配等问题求助
问题解决:通过自有应用访问第三方微软账户的MS Graph API
核心问题
自有应用需访问其他微软账户用户的MS Graph API,无需客户自行创建应用。当前已通过common端点获取用户授权的authorization code,但遇到两个问题:
- 二次调用使用同一授权码时,报错:
OAuth2 Authorization code was already redeemed, please retry with a new valid code or use an existing refresh token. - 使用自身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
相关产品推荐
相关产品推荐

