【问题标题】:NodeJS + Passport, retrieving an access token (Spotify API)NodeJS + Passport,检索访问令牌(Spotify API)
【发布时间】:2015-11-11 20:31:32
【问题描述】:

我正在学习 Node.js,并使用 Spotify API 编写一个非常简单的网络应用程序(创建播放列表)。

具体来说,我一直在使用passport-spotify 包,并使用提供的example 作为起点。

我已经能够在应用程序中进行正常的 API 调用,因为它们不需要任何用户身份验证,但是我现在需要发出请求并提供访问令牌。

我之前的调用显然是应用程序公共脚本中非常简单的 ajax 请求,但现在我需要访问令牌,我遇到了一些障碍。

目前我已经想到/尝试了两种方法,分别如下:

  • 将 Passport 检索到的访问令牌(并且看似忽略)存储为 cookie,然后在公共 javascript 中访问该 cookie,就像我在其他 API 调用中所做的那样。我不确定这种方法的安全性。无论哪种方式,我都无法弄清楚如何将其设置为 cookie,因为这需要 res.cookie(),而 res 没有传递到函数中。
  • 创建一个新路由,当使用 ajax 请求时将触发基于节点的 api 请求,因此访问令牌保持隐藏状态。下面是我想出的。我确实收到了似乎表明该想法有效的响应,但我不知道如何检索访问令牌。

    app.get('/playlist/:name', function(req, res){
    
    var options = {
      url: 'spotify api link, cannot post without more reputation',
      headers : {
        'Accept': 'application/json',
        'Authorization': 'Bearer ' + accessToken,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        name: req.params.name,
        public: false
      })
    };
    
    request.post(options, function(error, response, body){
      console.log(error);
      console.log(response);
      console.log(body);
    })
    
    });
    

请原谅我缺乏这方面的知识 - 这是我第一次深入研究后端开发和 OAuth。检索访问令牌似乎应该很容易,所以也许我做错了。

感谢阅读!

如果有人遇到同样的问题,请更新: 我通过为访问令牌创建一个全局变量来解决这个问题,当它通过应用程序时分配它,然后在回调阶段从它创建一个cookie - 在我上面提到的示例中app.get('/callback')...。然后我可以通过该 cookie 在我的公共 javascript 中读取令牌。

我应该说我不确定这是否是最好(或最安全)的方法,但它对我的目的有效。我认为为令牌制作一个全局变量并不好,但我不确定。

如果有人看到我的解决方案并注意到一个问题或更好的方法,我仍然很想听听。

【问题讨论】:

    标签: javascript node.js passport.js spotify


    【解决方案1】:

    使用访问令牌和刷新令牌调用护照配置的回调函数。

    passport.use(
    new SpotifyStrategy(
        {
          clientID: client_id,
          clientSecret: client_secret,
          callbackURL: 'http://localhost:8888/auth/spotify/callback'
        },
        function(accessToken, refreshToken, expires_in, profile, done) {
          User.findOrCreate({ spotifyId: profile.id }, function(err, user) {
            return done(err, user);
          });
        }
      )
    );
    

    您可以将该访问令牌和刷新令牌存储在数据库中。如果您的应用程序使用授权代码流,您可以在数据库中查找或创建一个用户,并将两个令牌存储在该用户对象中。然后你可以选择这个令牌并在你的请求中使用它。

    我建议看看https://github.com/thelinmichael/spotify-web-api-node。这是 Spotify API 的包装器,您可以在其中传递您的令牌,并且包装器将自动将您的访问令牌作为您发出的每个请求的标头包含在内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2016-07-24
      • 2018-10-31
      • 2021-12-13
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多