我何时以及如何刷新Node.Js中的Spotify API访问令牌

时间:2020-01-21 16:26:34

标签: node.js spotify refresh-token

我正在构建一个小程序,当前由一个.js文件组成,该文件输出特定Spotify列表的所有曲目。目前,我还没有建立一个自动刷新访问令牌的系统,这会在一小时后破坏程序。我不确定如何实现此功能,所以我在这里寻求帮助。

我有访问令牌和刷新令牌。这是我的代码,目前可以使用一个小时。

var request = require("request");
var user = USERNAME;
var token = "Bearer BQBpRXd...Yfofi8A";

var playlists_url = "https://api.spotify.com/v1/users/"+user+"/playlists";

request({url:playlists_url, headers:{"Authorization":token}}, function(err, res){
  if (res){
    var playlists = JSON.parse(res.body);
    playlists.items.forEach(function(playlist, i){
      if (playlists.items[i].id === "4N2...2PDX") {
        var playlist_url = playlists.items[i].href
        request({url:playlist_url, headers:{"Authorization":token}}, function(err, res){
          if (res){
            var playlist = JSON.parse(res.body);
            playlist.tracks.items.slice().reverse().forEach(function(track){
               console.log(track.track.name);
            });
          }
        });
      }
    });
  }
});

我希望有人可以帮助我,也许为我提供一些更好的代码,对我的旅途有帮助。

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是,一旦请求中收到未经授权/过期的令牌响应,就执行令牌刷新。参见Spotify API docs

例如,您可以执行以下操作:

注意: 此代码未经测试,可能需要对您进行一些调整。

 
var request = require("request");
var user = USERNAME;
const refresh_token = "REFRESH_TOKEN_FROM_INITIAL_AUTH";
let access_token = "AUTH_TOKEN_FROM_INITIAL_AUTH";
let token = "BASE64_ENCODED_USER:ACCESS_TOKEN?";

getPlaylists();

function refreshAuthToken(callback) {
  const refreshBody = querystring.stringify({
    grant_type: 'refresh_token',
    refresh_token: refresh_token,
  });
  const req = request(
    {
      // Assuming you have this setup as: https://accounts.spotify.com/api/token
      url: refresh_token_url, 
      method: 'POST',
      headers:{
        // Authorization: Basic <base64 encoded client_id:client_secret>
        'Authorization': token
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(refreshBody)
      }
    },
    (err, res) => {
      if (res) {
        const resData = JSON.parse(res.body);
        // Set new access tokens
        access_token = resData.access_token;
        // setup your Authorization token, e.g.
        token = btoa(access_token);
        callback();
      } else if (err) {
        // Handle error...
      }
    }
  );
  req.write(refreshBody);
}

function getPlaylists() {
  request(
    {
      url: playlists_url, 
      headers:{
        "Authorization": token
      }
    }, 
    function(err, res) {
      if (res) {
        var playlists = JSON.parse(res.body);
        playlists.items.forEach(function(playlist, i) {
          if (playlists.items[i].id === "4N2...2PDX") {
            var playlist_url = playlists.items[i].href;
            request(
              {
                url:playlist_url, 
                headers:{"Authorization":token}
              },
              function(err, res) {
                if (res) {
                  var playlist = JSON.parse(res.body);
                  playlist.tracks.items.slice().reverse().forEach(function(track){
                    console.log(track.track.name);
                  });
                }
              }
            );
          }
        });
      } else if (err) {
        // Check what type of error
        if (res.statusCode === 401) {
          // Refresh the token, if possible
          refreshAuthentication(getPlaylists);
        }
      }
    }
  );
}