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

Discord OAuth授权跳转返回400 Bad Request错误如何解决

问题根因

你兑换access token的请求地址填写错误,调用了授权页面的地址而非官方兑换凭证的接口地址,这是触发400错误的核心原因。


具体错误点

  • 错误1:POST请求地址错误
    你当前callback中POST请求的地址是https://discordapp.com/api/oauth2/authorize,这个是用户跳转授权的前端页面地址,兑换code为access token的正确接口地址是https://discord.com/api/oauth2/token。
  • 错误2:got库默认抛出非2xx响应错误
    got库默认情况下遇到4xx/5xx响应会直接抛出异常,进入你的全局错误捕获逻辑,你需要添加配置关闭自动抛错才能正常读取Discord返回的错误信息方便排查。
  • 错误3:redirect_uri不一致风险
    你发起授权请求时的redirect_uri是经过encodeURIComponent处理的,而兑换token时直接填写了原始地址,两者如果存在编码差异会被Discord判定为参数不匹配,触发400错误。

修正后的核心代码

router.get('/callback', catchAsync(async (req, res) => {
  if (!req.query.code) throw new Error('NoCodeProvided');
  const response = await fetch(`https://discord.com/api/oauth2/token`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: new URLSearchParams({
      client_id: CLIENT_ID,
      client_secret: CLIENT_SECRET,
      grant_type: "authorization_code",
      redirect_uri: decodeURIComponent(redirect), // 保持和授权请求的redirect_uri完全一致
      code: req.query.code,
      scope: 'identify'
    }),
    throwHttpErrors: false // 关闭got自动抛错,方便读取错误信息
  });
  const json = await response.json();
  // 可选:添加错误打印,方便后续排查
  if (!response.ok) {
    console.error('Discord token兑换失败', json);
    throw new Error('TokenExchangeFailed');
  }
  res.redirect(`/?token=${json.access_token}`);
}));

额外检查项

  • 确认你Discord开发者后台中填写的重定向地址和你代码里的https://ezapplications.live/api/discord/callback完全一致,包括协议、域名、路径、尾斜杠都不能有差异
  • 确认你填写的CLIENT_ID和CLIENT_SECRET是正确的,没有复制错误
  • 确认你的Discord应用状态是正常的,没有被限制调用接口

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:39:04