Express 在 auth 标头更改时创建不同的会话
Posted
技术标签:
【中文标题】Express 在 auth 标头更改时创建不同的会话【英文标题】:Express creates different session when auth header is changed 【发布时间】:2017-10-13 03:34:00 【问题描述】:我是新手,我正在尝试在用户登录我的应用程序时创建会话。我正在使用护照进行身份验证。要登录用户,我正在创建基本策略,并且在基本策略成功后,我正在创建一个 JWT 令牌,我将其存储在客户端的 cookie 中,并为后续请求使用 JWT 策略。
但我注意到 express-session 在我登录时创建了一个会话,该会话具有基本标头,而另一个会话用于后续调用具有 JWT 标头。
这是我在登录时保存会话的代码
signin = function(req, res, next)
passport.authenticate('basic', function(err, user, info)
if (err) return next(err)
if (!user)
return res.status(401).json( error: 'message' );
var token = jwt.encode( user: user, config.db.secret);
res.cookie('token', token, maxAge: 900000, httpOnly: true, path: '\/', Secure: true );
res.status(200).json( success: true, firstName: user.firstName );
delete user.password;
req.session.user = user;
req.session.save();
)(req, res, next);
;
但是当我调试此代码时,它在 req.sessionID 中显示一个 sessionID,并在以下代码中的 req.sessionID 中显示不同的 sessionID,作为 JWT 身份验证
listProducts = function(req, res)
debugger;
//here req.session.user is undefined which I have saved at login. and sessionID is also different
res.json( demo: 'response' );
;
我希望它在整个生命周期中都是相同的 sessionID,直到用户退出我的应用程序。 为什么会发生这种情况?有什么解决办法?
【问题讨论】:
你能在你的应用中添加快速会话和护照中间件的代码吗? 【参考方案1】:您在保存会话之前发送响应。
尝试保存会话,然后改为发送响应。
express-session
修改 res.end
以使其执行 express-session
特定任务,引入您成为受害者的顺序耦合:https://github.com/expressjs/session/blob/master/index.js#L249
【讨论】:
我试过了。但没有成功。session.save
是异步,这意味着它需要一个回调。将响应发送代码放在回调中。例如:req.session.save(function (err) if (err) return next(err); res.status(200).json(...) );
仍然没有。据我了解,passport.session 和 express.sesssion 应该自己处理。但不知何故,它在我的情况下不起作用。
然后通过使用浏览器开发工具查看随每个响应发送的 cookie 的内容来调试问题。
它应该包含什么?我可以看到 connect.sid 和令牌 cookie,这是我的 JWT 令牌。我猜 connect.sid 是用于会话的。以上是关于Express 在 auth 标头更改时创建不同的会话的主要内容,如果未能解决你的问题,请参考以下文章
REST API 没有根据标头中的 Passport JWT 令牌更改用户?
如何在所有请求中传输动态auth值,而不是在SOAPUI中更改每个请求的标头中的值
带有 HTTP-AUTH 的 node.js Express
Express.js/Passport 应用程序为每个请求创建新会话,尽管请求标头中有会话 ID
如何在 Elastic Beanstalk 上部署的 Express 服务器上创建“Access-Control-Allow-Origin”标头?