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 标头更改时创建不同的会话的主要内容,如果未能解决你的问题,请参考以下文章

Auth 标头未与 GET 请求一起发送

REST API 没有根据标头中的 Passport JWT 令牌更改用户?

如何在所有请求中传输动态auth值,而不是在SOAPUI中更改每个请求的标头中的值

带有 HTTP-AUTH 的 node.js Express

Express.js/Passport 应用程序为每个请求创建新会话,尽管请求标头中有会话 ID

如何在 Elastic Beanstalk 上部署的 Express 服务器上创建“Access-Control-Allow-Origin”标头?