Я пытаюсь создать веб-сайт, который использует 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);
});
Выше приведен полный код сервера.