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
相关产品推荐
相关产品推荐

