node.js - Spotify Node Web api - 多个用户的问题

标签 node.js api authentication web spotify

我正在开发一个使用 Spotify Node web API 的应用程序当多个用户登录我的应用程序时遇到麻烦。我能够成功地完成身份验证流程并在用户登录后获取 token 和用户 ID。我正在使用 Authorization Code授权用户(因为我想在过期后获得刷新 token )。然而,当前的问题是getUserPlaylists函数描述here (仅供引用,如果第一个参数为未定义,它将返回经过身份验证的用户的播放列表)返回最近经过身份验证的用户的播放列表,而不是当前使用该应用的用户。

示例 1:如果用户 A 登录应用程序,它将正常获取其播放列表。如果用户 B 登录该应用程序,它还会看到自己的播放列表。但是,如果用户 A 刷新页面,用户 A 会看到用户 B 的播放列表(而不是用户 A 自己的播放列表)。

示例2:用户A登录,用户B只需转到app/myplaylists路由就可以看到用户A的播放列表。

我的猜测是,问题出在这部分代码

    spotifyApi.setAccessToken(access_token);
    spotifyApi.setRefreshToken(refresh_token);

最新的用户 token 会覆盖之前的用户,因此之前的用户将失去执行诸如查看自己的播放列表之类的操作的授权。

  • 预期行为:用户 B 刷新页面后登录事件后,用户 A 会看到自己的播放列表。
  • 实际行为:在用户 B 登录且用户 A 刷新页面后,用户 A 可以看到用户 B 的播放列表。

我知道我可以在不使用 Spotify Node API 的情况下使用 token 只需使用 token 来发出请求,这应该没问题,但是,如果仍然能够使用 Node API 并处理多个用户,那就太好了。

以下是最有可能存在问题的代码部分:

export const createAuthorizeURL = (
    scopes = SCOPE_LIST,
    state = 'spotify-auth'
) => {
    const authUrl = spotifyApi.createAuthorizeURL(scopes, state);

    return {
        authUrl,
        ...arguments
    };
};

export async function authorizationCodeGrant(code) {
    let params = {
        clientAppURL: `${APP_CLIENT_URL || DEV_HOST}/app`
    };

    try {
        const payload = await spotifyApi.authorizationCodeGrant(code);
        const { body: { expires_in, access_token, refresh_token } } = payload;

        spotifyApi.setAccessToken(access_token);
        spotifyApi.setRefreshToken(refresh_token);

        params['accessToken'] = access_token;
        params['refreshToken'] = refresh_token;

        return params;
    } catch (error) {
        return error;
    }

    return params;
}

export async function getMyPlaylists(options = {}) {
    try {
        // if undefined, should return currently authenticated user
        return await spotifyApi.getUserPlaylists(undefined, options);
    } catch (error) {
         return error;
    }
}

非常感谢对此的任何帮助。我对我正在做的事情感到非常兴奋,所以如果有人能帮助我找到问题,那将意味着很多......

最佳答案

你走在正确的道路上。但是,当您设置访问 token 和刷新 token 时,您是在为整个应用程序设置它,并且调用您的服务器的所有用户都将使用它。不理想。

以下是 Node 中授权代码流程的工作示例:https://glitch.com/edit/#!/spotify-authorization-code

如您所见,它使用 SpotifyWebApi 的通用实例来处理身份验证,但它会为每个对用户数据的请求实例化一个新的 loggedInSpotifyApi,因此您可以获得请求该数据的用户的数据。

如果您想使用上面的示例,您可以开始编辑“重新混合”并创建您自己的项目副本。

黑客快乐!

关于node.js - Spotify Node Web api - 多个用户的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47958746/

相关文章:

javascript - 不推荐使用不带 'cursor' 选项的聚合命令

node.js - 如何在 Mongoose 的不同文件中分离模式、方法和静态

javascript - Google Data API SDK - 过滤器编码/转义

javascript - 类型错误 : Cannot read property 'categories' of null

asp.net - Thinktecture.IdentityModel 与 SimpleMembership

mysql - 我是sequelize的新手,如何将mysql查询转换为sequelize

javascript - 将字符串的部分与对象数组匹配

javascript - 使用 github API 在点击时显示 repo 提交

angularjs - 使用nodejs进行LDAP身份验证

delphi - 带身份验证的 DataSnap 回调