使用nodejs中的用户对象登录后将重新生成的会话ID发送回用户代理

Posted

技术标签:

【中文标题】使用nodejs中的用户对象登录后将重新生成的会话ID发送回用户代理【英文标题】:sending the regenerated session-id back to user agent after login with user object in nodejs 【发布时间】:2018-12-16 18:26:22 【问题描述】:

我在用户登录后重新生成session-id,新的会话ID被生成,我也将该会话ID保存在mongodb中,但问题是我如何发送重新生成的会话- id 与用户对象一起返回给用户代理(浏览器)。 I have already tried:

res.cookie('sessionId',req.session);
res.json(user);

我正在像这样重新生成 session-d:

let session = req.session;
console.log("printing old session");
console.log(req.sessionID);

req.session.regenerate(function(err) 

if (err)     console.log(err);
else
console.log("printing new session");
console.log(req.sessionID);

let prev_session = session;
//Copying Prev Session Data to current session.
for (let i in prev_session) 

req.session[i] = prev_session[i];


req.session.save();


) 

上面的代码返回带有 session-id 的用户对象:

set-cookie: sessionId=j%3A%7B%22cookie%22%3A%7B%22originalMaxAge%22%3A86400000%2C%22
expires%22%3A%222018-07-10T06%3A16%3A16.703Z%22%2C%22secure%22%3Afalse%2C%22httpOnly%22%3Atrue%2C%22
path%22%3A%22%2F%22%7D%2C%22_csrfSecret%22%3A%22fYvLa6exta46VA%3D%3D%22%2C%22passport%22%3A%7B%22
user%22%3A%225b1fcebb293e95fc28cafc97%22%7D%7D; Path=

使用之前的 sessionid:

set-cookie: sessionId=s%3AZ4HI3m3LzPcxRlp8HVEb4YzIGq3FuZbC.07kibg%2FguTNBTPlO5%2BTfHSkDh7GcQEzenlSqODetvb8; 
Path=/; Expires=Tue, 10 Jul 2018 06:16:29 GMT; HttpOnly

我仍然无法在我的 chrome 浏览器的会话 cookie 中看到更新的会话 ID

我的后端由快递和护照提供支持。

任何人都可以帮我解决这个问题...我已经花了很多时间来浏览这个问题并且没有任何可行的解决方案。

感谢您。

【问题讨论】:

当你req.session[i] = prev_session[i];时,它不是也复制会话ID吗?你能在 forloop 里面放一个console.log("::"+prev_session[i]) 并粘贴输出吗?如果是打印对象,请在打印前对其进行 JSON.stringify。 ::"cookie":"originalMaxAge":86399999,"expires":"2018-07-10T09:04:31.824Z","sec ure":false,"httpOnly": true,"path":"/","_csrfSecret":"6Yml234gs6SA==","passport t":"user":"5b1fc23423423423497" ...我尝试打印整个`prev_session`,这是我得到的结果.. @eduPeeth 你在使用cookie-parser吗? 是的@DushyantBangal 有什么方法可以随时随地调用 req.login() 只需在函数执行或凭据检查后更改会话 ID。护照是否提供此功能? @DushyantBangal 【参考方案1】:

我不完全确定为什么你的代码中有sessionIdreq.sessionIDreq.session,因为它们都是不同的东西。

使用cookie-parser

写入 cookie:

res.cookie('myCookieName',myValue)

读取 cookie:

req.cookies.myCookieName

如果您重新生成的新会话 ID 在 req.sessionID 中,则在设置 cookie 时使用它而不是 req.session

我有一个基本示例可以指导您的实施:

const express = require('express'),
    cookieParser = require('cookie-parser');

const app = express();

var i =0;
app.use(cookieParser());

app.get('/', (req, res) => 

    console.log("Previous cookie: ",req.cookies.sessionId);
    res.cookie('sessionId',i:++i, maxAge: 900000, httpOnly: true );
    res.send('Hello World!'));

app.listen(3000, () => console.log('Example app listening on port 3000!'));

这将打印请求中发送的 cookie,然后发回一个新的。在每个请求中,您都会在节点控制台上看到不同的数字。

【讨论】:

sessionId 是 cookie 的名称,req.sessionID 返回当前会话 ID,req.session 返回当前会话对象,这些我需要使用以便我可以复制用户等数据对象和 xsrf 令牌 ... 是的,但是您将 req.session 设置为 cookie 值,这让我感到困惑。无论如何,如果这些是由护照处理的,那么你会得到那些。这就是设置 cookie 的方法。

以上是关于使用nodejs中的用户对象登录后将重新生成的会话ID发送回用户代理的主要内容,如果未能解决你的问题,请参考以下文章

使用 Nodejs Connect 重新生成会话 ID

成功登录后将用户数据从 Nodejs 服务器推送到 Angular

在nodejs中删除浏览器关闭时的会话

NodeJS redis 连接会话 ID 在应该保持不变时重新生成

PHP在登录/退出时重新生成会话ID不起作用

会话固定漏洞