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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:27:37