我正在尝试创建一个网站,以根据流派来组织音乐,因此,我需要使用spotify API。我授权并将session.loggedIn和其他变量设置为所需的变量。但是,这些变量在设置后不会保存。以下是最重要的代码(还包括完整的代码)。登录后是访问Spotify登录页面并被重定向后发送给用户的位置。
request.post(clientServerOptions, (err, postres, body) => onReplyToAuth(req,res,err,postres,body))
然后从服务器调用auth POST,以获取用于数据访问的密钥。通讯全部成功,正文中接收到的数据是正确的数据(已确认)。
{
if(req.session.loggedIn) res.redirect(res.locals.pathPrefix+"/listofplaylists");
else if(true)
{
var code = req.query.code
if(!code) res.redirect(res.locals.pathPrefix);
else
{
req.session.authCode = code;
var clientServerOptions =
{
url: "https://accounts.spotify.com/api/token",
form:
{
grant_type : "authorization_code",
code: code,
redirect_uri:"http://www.localhost:8080"+res.locals.pathPrefix+"/afterSignIn"
},
headers:
{
'Authorization' : 'Basic ' + (new Buffer(myClientId+":"+myClientSecret).toString("base64"))
},
json: true
};
request.post(clientServerOptions, (err, postres, body) => onReplyToAuth(req,res,err,postres,body));
}
}
else
{
res.redirect(res.locals.pathPrefix);
}
});
function onReplyToAuth(req,res,err,postres,body)
{
console.log(body);
if(!err)
{
req.session.loggedIn = true;
req.session.loggingIn = false;
req.session.accessToken = body.access_token;
req.session.refreshToken = body.refresh_token;
console.log("Before saving:");
console.log(req.session);
req.session.save(function(err)
{
if(!err)
{
console.log("After saving:")
console.log(req.session);
res.redirect(res.locals.pathPrefix+"/listofplaylists");
}
});
}
else
{
res.redirect(res.locals.pathPrefix);
}
}
使用router.use((req,res,next)=>{console.log(req.session);next()});
,我注意到在新请求中,所有设置变量的req.session.x
均未定义。此外,我检查了代码的执行情况(分配后使用控制台日志,并且会话和变量可用(req.session
在此处正确设置)。
全源:
var request = require('request');
var createError = require('http-errors');
var path = require('path');
var cookieParser = require('cookie-parser');
var router = express.Router();
var session = require("express-session")({secret: 'cookie secret',
resave: false,
saveUninitialized: true,
cookie: { secure: true }});
var myClientId = "my id";
var myClientSecret = "my secret"
router.use(session)
router.use((req,res,next)=>{console.log(req.session);next()});
router.get("/requestsignin", function(req,res,next)
{
var scopes="playlist-read-collaborative playlist-modify-public playlist-read-private playlist-modify-private";
res.redirect('https://accounts.spotify.com/authorize' +
'?response_type=code' +
'&client_id=' + myClientId +
(scopes ? '&scope=' + encodeURIComponent(scopes) : '') +
'&redirect_uri=' + encodeURIComponent("http://www.localhost:8080"+res.locals.pathPrefix+"/afterSignIn"));
});
router.get("/afterSignIn", function(req, res)
{
if(req.session.loggedIn) res.redirect(res.locals.pathPrefix+"/listofplaylists");
else if(true)
{
var code = req.query.code
if(!code) res.redirect(res.locals.pathPrefix);
else
{
req.session.authCode = code;
var clientServerOptions =
{
url: "https://accounts.spotify.com/api/token",
form:
{
grant_type : "authorization_code",
code: code,
redirect_uri:"http://www.localhost:8080"+res.locals.pathPrefix+"/afterSignIn"
},
headers:
{
'Authorization' : 'Basic ' + (new Buffer(myClientId+":"+myClientSecret).toString("base64"))
},
json: true
};
request.post(clientServerOptions, (err, postres, body) => onReplyToAuth(req,res,err,postres,body));
}
}
else
{
res.redirect(res.locals.pathPrefix);
}
});
function onReplyToAuth(req,res,err,postres,body)
{
if(!err)
{
req.session.loggedIn = true;
req.session.loggingIn = false;
req.session.accessToken = body.access_token;
req.session.refreshToken = body.refresh_token;
res.redirect(res.locals.pathPrefix+"/listofplaylists");
}
else
{
res.redirect(res.locals.pathPrefix);
}
}
function requestSpotifyData(url,req, callback)
{
var authOptions =
{
url:url,
headers:
{
'Authorization':"Bearer " + req.session.accessToken
},
json : true
}
request.get(authOptions,callback);
}
router.get("/listofplaylists", function(req,res,next)
{
if(!req.session.loggedIn)
{
res.redirect(res.locals.pathPrefix)
}
else
{
requestSpotifyData("https://api.spotify.com/v1/me/playlists?limit=50",req,(err,postres,body) =>
{
res.render("listOfplaylists",
{
playlists : body.items
});
});
}
});
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;
Nodemon app.js调试(请注意,代码在获取日志之前运行(上面的代码对应于请求):
Session {
cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: true
}
}
GET /spotify/requestsignin 302 18.590 ms - 628
Session {
cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: true
}
}
(node:1596) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
{
access_token: 'access token',
token_type: 'Bearer',
expires_in: 3600,
refresh_token: 'refresh token',
scope: 'playlist-read-private playlist-read-collaborative playlist-modify-private playlist-modify-public'
}
Before saving:
Session {
cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: true
},
authCode: 'auth code',
loggedIn: true,
loggingIn: false,
accessToken: 'access token',
refreshToken: 'refresh token'
}
After saving:
Session {
cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: true
},
authCode: 'auth code',
loggedIn: true,
loggingIn: false,
accessToken: 'access token',
refreshToken: 'refresh token'
}
GET /spotify/afterSignIn?code=auth code 302 141.181 ms - 92
Session {
cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: true
}
}
GET /spotify/listofplaylists 302 6.726 ms - 60
Session {
cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: true
}
}
GET /spotify/ 304 238.770 ms - -
GET /spotify/stylesheets/style.css 304 1.629 ms - -
Session {
cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: true
}
}
GET /spotify/ 304 15.980 ms - -
感谢您的帮助!
我不确定这是否是问题所在,但有可能在会话完全保存在res.redirect
函数中之前调用了onReplyToAuth
,您可能想尝试调用req.session.save
然后传递一个会话保存后将重定向的回调函数。
req.session.loggedIn = true;
req.session.loggingIn = false;
req.session.accessToken = body.access_token;
req.session.refreshToken = body.refresh_token;
req.session.save(function(err) {
// session saved
res.redirect(res.locals.pathPrefix+"/listofplaylists");
})
希望对您有帮助。
当我在忙着更改我的会话设置时,>
var session = require("express-session")({secret: 'secret`376712', resave: false, saveUninitialized: true, cookie: { secure: true}});
to
var session = require("express-session")({secret: 'secret`376712', resave: false, saveUninitialized: true, cookie: { secure: false }});
并且我获得了具有所需输出的播放列表列表(不再重置会话)。我认为这是一个解决办法,因为与服务器的连接是HTTP而不是HTTPS,因此不发送cookie。但是我对此不确定。
非常感谢其他与我一起思考的人!
PS:我将尝试更新此帖子,以实现其他人的最佳可达性。