使用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】:
我不完全确定为什么你的代码中有sessionId
、req.sessionID
、req.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 服务器推送到 Angular