如何在Spotify OAuth2流程的重定向URL中获取用户Discord ID
问题解决方案
核心问题梳理
- 无法将Discord ID传递至Spotify OAuth2重定向URL,导致令牌无法与用户关联存储
/spotifyAuth接口中res.send()返回内容丢失- Promise回调内无法获取用户的Discord信息
分步解决方法
1. 用OAuth2的state参数传递Discord ID
Spotify OAuth2支持state参数传递自定义数据,可直接将Discord ID(生产环境建议加密)放入该参数:
- 修改
/spotifyLoginUrl接口,接收Discord ID并生成带state的授权URL - 示例代码:
app.get('/spotifyLoginUrl', (req, res) => { // 从请求参数获取Discord ID(由Discord机器人交互请求传递) const discordId = req.query.discordId; const sc = new SpotifyController(); // 生成授权URL时拼接state参数 const authURL = sc.getLoginUrl({ state: discordId }); res.status(200).send(authURL); });
- 需确保
SpotifyController的getLoginUrl方法支持传入state参数,将其添加到授权URL的查询参数中
2. 修复res.send()内容丢失问题
当前代码未正确处理异步逻辑,改用async/await写法确保响应正常发送:
app.get('/spotifyAuth', async (req, res) => { try { const code = req.query.code; const discordId = req.query.state; // 从state参数取出Discord ID const sc = new SpotifyController(); // 用await等待Promise完成,避免回调嵌套导致响应异常 const data = await sc.spotifyApi.authorizationCodeGrant(code); // 将令牌存入Firebase,关联对应Discord ID的文档 await firebase.database().ref(`users/${discordId}`).set({ accessToken: data.body.access_token, refreshToken: data.body.refresh_token, expiresAt: Date.now() + data.body.expires_in * 1000 }); res.status(200).send('登录成功,令牌已关联您的Discord账户!'); } catch (error) { res.status(400).send(`登录失败:${error.message}`); } });
- 用
try/catch捕获异常,避免请求挂起无响应 - 替换
then回调为await,让逻辑更清晰,确保res.send()能正确执行
3. 在回调中获取Discord用户信息
通过req.query.state拿到Discord ID后,可调用Discord API拉取用户信息(需机器人令牌):
// 示例:根据Discord ID获取用户信息 const fetchDiscordUser = async (discordId) => { const response = await fetch(`https://discord.com/api/users/${discordId}`, { headers: { 'Authorization': `Bot ${process.env.DISCORD_BOT_TOKEN}` } }); return response.json(); }; // 在/spotifyAuth接口中调用 const userInfo = await fetchDiscordUser(discordId); console.log('当前Discord用户信息:', userInfo);
内容的提问来源于stack exchange,提问作者Philip Butler
相关产品推荐
相关产品推荐

