我正在尝试创建一个使用Spotify API的网站,而我一直试图使授权代码流程正常工作。下面是我正在使用的代码。
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);
});
上面是服务器的完整代码。