Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS+;Passport,检索访问令牌(Spotify API)_Javascript_Node.js_Passport.js_Spotify - Fatal编程技术网

Javascript NodeJS+;Passport,检索访问令牌(Spotify API)

Javascript NodeJS+;Passport,检索访问令牌(Spotify API),javascript,node.js,passport.js,spotify,Javascript,Node.js,Passport.js,Spotify,我正在学习Node.js,并使用Spotify API编写一个非常简单的web应用程序(创建播放列表) 具体来说,我一直在使用这个包,并将提供的作为起点 我能够在应用程序中进行正常的API调用,因为它们不需要任何用户身份验证,但是我现在需要发出请求并提供访问令牌 app.get('/playlist/:name', function(req, res){ var options = { url: 'spotify api link, cannot post without more rep

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

具体来说,我一直在使用这个包,并将提供的作为起点

我能够在应用程序中进行正常的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);
})

});
我以前的调用显然是应用程序公共脚本中非常简单的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中的令牌

我应该说,我不确定这是否是最好(或最安全)的方法,但它对我的目的起了作用。我假设为令牌创建一个全局变量是不好的,但我不确定


如果有人看到我的解决方案并注意到一个问题或更好的方法,我仍然有兴趣听到这一点

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

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);
      });
    }
  )
);
您可以将该访问令牌和刷新令牌存储在数据库中。如果应用程序使用授权代码流,则可以在数据库中查找或创建用户,并将这两个令牌存储在该用户对象中。然后,您可以提取此令牌并在您的请求中使用它

我建议看一看。这是Spotify API的包装器,您可以在其中传递令牌,包装器将自动将您的访问令牌作为您发出的每个请求的头