如何使用OAuth存储和发送带API请求的授权令牌?

时间:2018-01-21 01:42:06

标签: javascript oauth-2.0 authorization spotify access-token

我正在尝试设置我的应用程序,以便我可以使用Spotify API。他们的API需要一个授权令牌以及每个请求,并且每个用户会话的此令牌都不同。我已经使用'passport-spotify'模块(详情如下)成功实现了OAuth2登录,并拥有令牌,我目前存储在我的数据库中。一旦它在数据库中,它也可以在我的Redux商店中使用。

功能护照策略:

  const spotifyConfig = {
    clientID: process.env.SPOTIFY_CLIENT_ID,
    clientSecret: process.env.SPOTIFY_CLIENT_SECRET,
    callbackURL: process.env.SPOTIFY_CALLBACK
  }

  const strategy = new SpotifyStrategy(spotifyConfig, (accessToken, refreshToken, profile, done) => {
    const spotifyId = profile.id
    const name = profile.displayName
    const email = profile.emails[0].value

    User.find({where: {spotifyId}})
      .then(foundUser => (foundUser
        ? foundUser.update({accessToken, refreshToken}).then(() => done(null, foundUser))
        : User.create({name, email, spotifyId, accessToken, refreshToken})
          .then(createdUser => done(null, createdUser))
      ))
      .catch(done)
  })

  passport.use(strategy)


router.get('/', passport.authenticate('spotify', {scope: ['user-read-email'], showDialog: true}))

router.get('/callback', passport.authenticate('spotify', {
  successRedirect: '/home',
  failureRedirect: '/login'
}))

我目前所坚持的是如何设置我的API请求,以便在每次调用时访问该令牌。 'spotify-web-api-node'节点模块有一个setCredentials方法,但我无法弄清楚如何访问令牌。

半功能API调用(它发出API请求,但未经授权使用403):

const SpotifyWebApi = require('spotify-web-api-node');

const spotifyApi = new SpotifyWebApi();

spotifyApi.setCredentials({
  clientId: 'my client id',
  clientSecret: 'my client secret',
  redirectUri: 'http://localhost:8888/auth/spotify/callback',
  refreshToken: 'cant figure out how to properly include this',
  accessToken: 'and this.',
});


export function searchMetallica(){
  return spotifyApi.searchArtists('Metallica')
  .then(function(data) {
    console.log(data.body);
  }, function(err) {
    console.error(err);
  });
}

我希望这不是一个新手问题。提前谢谢。

1 个答案:

答案 0 :(得分:1)

你非常接近!

在您的情况下,您需要将令牌传递给Spotify包装器上的setAccessToken()方法:

spotifyApi.setAccessToken(<youraccesstoken>);

您可以以可预测的类似方式设置刷新令牌:

spotifyApi.setRefreshToken(<yourrefreshtoken>);

轻松自在!

但是,有一个问题。如果您对所有呼叫使用此spotifyApi,则会为所有这些呼叫设置相同的访问令牌!您需要确保为每个用户使用适当的访问令牌,因此用户A无法为用户B执行操作,反之亦然。

您可以通过简单地实例化API包装器并在用户登录时或者在进行调用时设置访问令牌来解决这个问题。例如,获取热门曲目的调用可能看起来像(为方便起见使用Express):

app.get('/myendpoint', function (request, response) {

  const loggedInSpotifyApi = new SpotifyWebApi();
  loggedInSpotifyApi.setAccessToken(request.access_token);

  // Get top tracks!
  loggedInSpotifyApi.getMyTopTracks()
    .then(function(data) {
      response.send(data.body);
    }, function(err) {
      console.error(err);
    });   
});

这是一个完整的Glitch,它显示了授权代码流程和spotify-web-api-node:https://glitch.com/edit/#!/spotify-authorization-code

如果您有任何疑问,请与我联系!