我正在学习Node.js,并使用Spotify API编写一个非常简单的Web应用程序(创建一个播放列表)。
具体来说,我一直在使用passport-spotify包,并使用example作为起点。
我已经能够在应用程序中进行正常的API调用,因为它们不需要任何用户身份验证,但我现在需要发出请求并提供访问令牌。
我之前的调用显然是在应用程序的公共脚本中非常简单的ajax请求,但现在我需要访问令牌,我遇到了一些障碍。
到目前为止,我已经考虑过/尝试了两种方法,它们如下:
res.cookie()
,并且res
不会传递给函数。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.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的包装器,您可以在其中传入令牌,包装器会自动将您的访问令牌作为标头包含在您发出的每个请求中。