Когда и как мне следует обновить sh мой токен доступа Spotify API в Node.Js - PullRequest
1 голос
/ 21 января 2020

Я создаю небольшую программу, в настоящее время состоящую из одного. js файла, который выводит все дорожки определенного c списка Spotify. В настоящее время мне не удалось построить систему, которая автоматически обновляет токен доступа, это нарушит работу программы через час. Я не уверен, как реализовать эту функцию, поэтому я прошу здесь о помощи.

У меня есть токен доступа и refre sh токен. Это мой код, который в настоящее время работает в течение часа.

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 голосов
/ 21 января 2020

Один из способов сделать это - выполнить обновление токена sh, как только вы получите неавторизованный / просроченный ответ токена в вашем запросе. См. Spotify API документы .

Например, вы можете сделать следующее:

ПРИМЕЧАНИЕ: Этот код не проверен и может потребоваться настройки на вашем конце.

 
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);
        }
      }
    }
  );
}
...