如何通过Microsoft Login API获取兑换refresh_token的code及解决相关报错
解决Microsoft Login获取refresh_token的跨域及PKCE问题
方案一:后端服务发起token兑换(使用Web类型redirect_uri)
- 将redirect_uri类型设置为Web,但必须保证第二步的
/token端点请求由后端服务器发起,禁止在前端浏览器中直接调用。 - 操作流程:
- 前端跳转至
https://login.microsoftonline.com/common/oauth2/v2.0/authorize获取授权code。 - 前端将code传递给后端服务。
- 后端携带
client_id、client_secret、code、redirect_uri等参数,发起POST请求到/token端点兑换refresh_token。
- 前端跳转至
- 原理:Web类型redirect_uri不允许前端跨域兑换token,但后端服务器发起请求不存在跨域限制,可直接避开AADSTS90023错误。
方案二:纯前端SPA应用(使用Single-page application类型redirect_uri)
- 必须实现**PKCE(Proof Key for Code Exchange)**流程,这是SPA类型redirect_uri的强制验证要求,否则会触发"Proof Key for Code Exchange is required"错误。
- 操作流程:
- 前端生成随机的
code_verifier(64-128位随机字符串),通过SHA-256哈希后转换为base64url格式,得到code_challenge。 - 调用
/authorize端点时,额外携带code_challenge和code_challenge_method=S256参数。 - 获取授权code后,调用
/token端点时携带code_verifier参数,完成验证并获取refresh_token。
- 前端生成随机的
额外注意事项
- 混合架构(前端+后端)优先选择方案一,因为SPA类型的refresh_token存储在前端存在安全风险,后端存储更可靠。
- 确保配置的redirect_uri与请求中使用的完全一致,包括协议(http/https)、域名、端口,任何细微差异都会导致验证失败。
内容的提问来源于stack exchange,提问作者Steve Lewis
相关产品推荐
相关产品推荐

