无需重新认证,如何通过Microsoft OAuth获取其他资源Access Token?
问题原因
你当前的报错是因为初始授权仅获取了XboxLive相关权限,refresh token的权限范围被限制在首次授权的scope内,无法直接用它获取未经过用户授权的Graph API相关scope的令牌。
解决方案:增量授权(无需用户重新输入密码,仅需同意新权限)
要获取包含Graph API scope的新令牌,必须发起增量授权请求,引导用户再次授权新增的权限范围,具体步骤如下:
- 构造增量授权请求URL
使用Microsoft Identity Platform的v2.0授权端点,包含原有scope和新增的Graph相关scope,确保用户仅需确认新增权限:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize ?client_id=<CLIENT_ID> &response_type=code &scope=XboxLive.signin offline_access https://graph.microsoft.com/.default openid &redirect_uri=<REDIRECT_URL> &prompt=consent &login_hint=<USER_EMAIL> # 可选,预填用户邮箱提升体验
prompt=consent:强制弹出权限同意界面,确保用户确认新增的Graph权限- 保留原有scope是为了避免丢失已授权的XboxLive权限
获取新的authorization_code
用户访问上述URL并同意权限后,会跳转到指定的redirect_uri,携带新的code参数。用新code换取全量权限的令牌
调用token端点,用新code获取包含XboxLive和Graph权限的access_token和refresh_token:
https://login.microsoftonline.com/common/oauth2/v2.0/token grant_type=authorization_code client_id=<CLIENT_ID> client_secret=<CLIENT_SECRET> code=<NEW_AUTHORIZATION_CODE> redirect_uri=<REDIRECT_URL> scope=XboxLive.signin offline_access https://graph.microsoft.com/.default openid
- 后续用新refresh_token获取Graph令牌
拿到新的refresh_token后,即可直接用它获取Graph相关的access_token,无需用户再次操作:
https://login.microsoftonline.com/common/oauth2/v2.0/token grant_type=refresh_token client_id=<CLIENT_ID> client_secret=<CLIENT_SECRET> refresh_token=<NEW_REFRESH_TOKEN> scope=https://graph.microsoft.com/.default openid offline_access
注意事项
- 必须使用
login.microsoftonline.com的v2.0端点,而非旧的login.live.com端点,v2.0支持增量授权和统一权限管理。 - 增量授权时必须包含所有需要保留的原有scope,否则新令牌会丢失原有权限。
内容的提问来源于stack exchange,提问作者SneakyFoxy
相关产品推荐
相关产品推荐

