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

Azure应用无法从授权码获取AccessToken:AADSTS54005错误求助

解决AADSTS54005授权码重复兑换问题

你遇到的AADSTS54005错误是典型的授权码被重复使用导致的,核心原因是你的代码里做了两次授权码兑换操作:一次是passport-azure-ad库自动完成的,另一次是你手动调用adal-node的acquireTokenWithAuthorizationCode触发的。

为什么会重复兑换?

你的passport-azure-ad配置里设置了responseType: 'code id_token',这属于OAuth2混合流。当Azure AD把回调请求发送到你的应用时,passport-azure-ad的OIDCStrategy会自动处理授权码,完成兑换access token和id token的流程,并且把这些token传递到验证回调函数中。这时候你再用同一个授权码去调用adal-node的接口,自然会提示“已被兑换”。

解决方案:直接从passport回调获取Token

不需要手动调用adal-node来兑换授权码,直接在passport的验证回调里拿到所需的token即可。调整你的代码如下:

const OIDCStrategy = require('passport-azure-ad').OIDCStrategy;

passport.use(new OIDCStrategy(options, (req, iss, sub, profile, accessToken, refreshToken, done) => {
  // 这里直接获取到已经兑换好的accessToken和refreshToken
  console.log('获取到的Access Token:', accessToken);
  console.log('获取到的Refresh Token:', refreshToken);
  
  // 在这里处理你的用户逻辑,比如创建/更新用户记录
  // ...
  
  return done(null, profile);
}));

如果你确实需要手动兑换(不推荐)

如果因为特殊需求必须手动控制token兑换流程,你需要修改passport-azure-ad的配置:

  • 将responseType改为code(纯授权码流)
  • 确保策略不会自动兑换授权码(需要查阅passport-azure-ad的文档,关闭自动兑换逻辑)
  • 此时再用adal-node调用兑换接口才不会冲突

但这种方式会增加代码复杂度,除非必要,否则推荐使用第一种方案,利用库的内置逻辑来避免错误。

额外排查要点

  • 确认你的redirectUrl在Azure AD应用注册中心和代码配置里完全一致(包括HTTP/HTTPS、是否带结尾斜杠等细节)
  • 检查是否存在前端重复触发回调请求的情况,导致同一个授权码被多次提交
  • 确保授权码没有被存储或在其他地方重复使用(授权码本身是一次性的,兑换后立即失效)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:07:44