Discord OAuth2如何正确配置鉴权头以获取用户信息,解决401未授权错误
错误原因
- 你直接将授权回调返回的
code当作访问令牌使用,这不符合OAuth2流程,该code必须先兑换为access_token后才能用于请求用户信息接口 - 请求Discord API时使用了HTTP协议,官方接口仅支持HTTPS访问,会直接导致鉴权失败
修复步骤
- 先调用Discord令牌兑换接口,用
code换取access_token - 用兑换得到的
access_token作为Bearer参数请求用户信息接口 - 将所有Discord API请求地址改为HTTPS协议
修复后代码
app.get('/oauth', async (req, res) => { const fetch = require('node-fetch'); const CLIENT_ID = '你的客户端ID'; const CLIENT_SECRET = '你的客户端密钥'; const REDIRECT_URI = 'https://widgets.fireyjs.repl.co/oauth'; if (req.query.code) { try { // 第一步:用code兑换access_token const tokenRes = await fetch('https://discord.com/api/oauth2/token', { method: 'POST', body: new URLSearchParams({ client_id: CLIENT_ID, client_secret: CLIENT_SECRET, grant_type: 'authorization_code', code: req.query.code, redirect_uri: REDIRECT_URI, scope: 'identify guilds.join messages.read' }), headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }); const tokenData = await tokenRes.json(); // 第二步:用access_token获取用户信息 const userRes = await fetch('https://discord.com/api/users/@me', { headers: { Authorization: `Bearer ${tokenData.access_token}` } }); const userInfo = await userRes.json(); console.log(userInfo); res.send('CODE: ' + req.query.code); } catch (err) { console.error('请求出错:', err); res.status(500).send('请求失败'); } } else { res.send('<script>window.location.assign("https://discord.com/api/oauth2/authorize?client_id=880520534125838356&redirect_uri=https%3A%2F%2Fwidgets.fireyjs.repl.co%2Foauth&response_type=code&scope=identify%20guilds.join%20messages.read")</script>') } });
注意事项
- 客户端密钥
CLIENT_SECRET需从Discord开发者后台获取,注意不要泄露到前端或者公开代码仓库 - 兑换令牌时传入的
redirect_uri必须和授权链接中的redirect_uri完全一致,否则会兑换失败
内容的提问来源于stack exchange,提问作者FireyJS
相关产品推荐
相关产品推荐

