【问题标题】:When and how should I refresh my Spotify API access token in Node.Js我应该何时以及如何在 Node.Js 中刷新我的 Spotify API 访问令牌
【发布时间】:2020-01-21 16:26:34
【问题描述】:

我正在构建一个小程序,目前由一个 .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);
            });
          }
        });
      }
    });
  }
});

我希望有人可以帮助我解决这个问题,也许可以为我提供一些更好的代码来帮助我完成我的旅程。

【问题讨论】:

  • 一般情况下,您要么获得一个永久的 API 密钥,要么在发现自己未经授权时登录。

标签: node.js spotify refresh-token


【解决方案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);
        }
      }
    }
  );
}

【讨论】:

  • @khagen 你介意接受这个作为答案吗?
猜你喜欢
  • 1970-01-01
  • 2017-06-26
  • 2016-03-13
  • 2016-11-22
  • 1970-01-01
  • 2021-11-27
  • 2012-09-29
  • 2021-08-09
  • 1970-01-01
相关资源
最近更新 更多