Предоставить код авторизации Spotify: Неверный запрос - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь создать веб-сайт, который использует API Spotify, и я застрял, пытаясь заставить поток кода авторизации работать. Ниже приведен код, который я использую.

app.get('/login', function(req, res) {
  var scope = 'user-read-private';
  res.redirect('https://accounts.spotify.com/authorize?' +
    querystring.stringify({
      response_type: 'code',
      client_id: clientId,
      scope: scope,
      redirect_uri: redirectUri,
      state: state
    }));
});

app.get('/callback', function(req, res) {
  res.status(200);
  var code = req.query.code;
  console.log('\ncode:', code, '\n');
  spotify.authorizationCodeGrant(code).then(
    function(data) {
      console.log('The access token expires in ' + data.body['expires_in']);
      console.log('The access token is ' + data.body['access_token']);

      spotify.setAccessToken(data.body['access_token']);
      spotify.setRefreshToken(data.body['refresh_token']);
    },
    function(err) {
      console.log('Could not login!', err);
    }
  );
  res.redirect('/');
});

Проблема, с которой я сталкиваюсь, заключается в том, что, когда он достигает вызова authorizeCodeGrant, он просто терпит неудачу и выдает ошибку 400 неверных запросов, и я не уверен почему, потому что я знаю, что получаю код из Spotify, код просто не похоже на работу.

var path = require('path');
var express = require('express');
var request = require('request');
var exphbs = require('express-handlebars');
var querystring = require('querystring');
var url = require('url');
var Spotify = require('spotify-web-api-node');
var keys = require('./keys');

var scopes = ['playlist-modify-private', 'user-read-private'],
  redirectUri = 'http://localhost:3000/callback',
  clientId = 'client_id',
  clientSecret = 'client_secret',
  state = 'some-state-of-my-choice';

var spotify = new Spotify({
  redirectUri: redirectUri,
  clientId: clientId,
  redirectUri: redirectUri
});

var results = [];
var login = 1;//keeps track if logged into spotify

var tokenExpiration;

var app = express();
var port = process.env.PORT || 3000;

app.engine('handlebars', exphbs({ defaultLayout: 'main'}));
app.set('view engine', 'handlebars');

app.get('/', function(req, res, next){
   res.status(200);
   res.render('searchPage', {
     login: login,
     results: results
   });
});

app.get('/login', function(req, res) {
  var scope = 'user-read-private';
  res.redirect('https://accounts.spotify.com/authorize?' +
    querystring.stringify({
      response_type: 'code',
      client_id: clientId,
      scope: scope,
      redirect_uri: redirectUri,
      state: state
    }));
});

app.get('/callback', function(req, res) {
  var code = req.query.code;
  console.log('\ncode:', code, '\n');
   spotify.authorizationCodeGrant(code).then(
     function(data) {
       console.log('The access token expires in ' + data.body['expires_in']);
       console.log('The access token is ' + data.body['access_token']);

       spotify.setAccessToken(data.body['access_token']);
       spotify.setRefreshToken(data.body['refresh_token']);

       tokenExpiration = new Data().getTime()/1000 + data.body['expires_in'];
       login = 0;
     },
     function(err) {
       console.log('Could not login!', err);
     }
   );
  if(login == 0){
    res.redirect('/#' +
    querystring.stringify({
      access_token: spotify.getAccessToken(),
      refresh_token: spotify.getRefreshToken()
    }));
  }else{
    res.redirect('/');
  }
});

var numberOfTimesUpdated = 0;

setInterval(function() {
  if(++numberOfTimesUpdated > 5 && login == 0) {
    clearInterval(this);

    spotify.refreshAccessToken().then(
      function(data) {
        tokenExpiration = new Data().getTime()/1000 + data.body['expires_in'];
        spotify.setAccessToken(data.body['access_token']);
      },
      function(err) {
        console.log('Could not refresh the token!', err.message);
      }
    );
  }
}, 1000);

app.post('/search/:title', function(req, res) {
  var search = req.params.title.toLowerCase();//req.body.search;
  console.log('search', search);

  resutls = [];

  spotify.searchTracks(search, function(err, data) {
    if(err) {
      console.error('something went wrong...');
      return;
    }

    console.log('I got' + search.body.tracks.total + 'results!');

    search.body.tracks.items.forEach(function(track){
      results.push({
        artist: track.artist[0].name,
        song: track.name,
        preview: track.external_urls.sp,
        album: track.album.name
      });
      res.render('searchPage', {
        login: login,
        results: results
      });
    });
  });
});

app.use(express.static('public'));

app.listen(port, function(err){
  console.log("== Server is listening on port", port);
});

Выше приведен полный код сервера.

...