在express中成功验证后才创建会话

时间:2013-01-28 04:03:07

标签: node.js session authentication express sessionid

我需要在成功验证后才创建会话。

我能够使用快速中间件创建基于redisStore的会话,但是当第一个请求到达服务器时,它会创建会话。

但是如何在成功验证后才能创建会话。 我用Google搜索了一下,发现req.session.regenerate()(但我发现这个问题如下所述: Regenerate session IDs with Nodejs Connect

但是在重新生成的情况下,它会创建一个新的,假设已经创建了旧的,并且使用相同的参数创建。

因此,只有在成功验证后才能创建新的会话ID。

2 个答案:

答案 0 :(得分:3)

您可能会将会话的想法与经过身份验证的会话的想法混为一谈。

所有用户都有会话是正常的 - 即使是匿名的,尚未登录的用户也是如此。这与经过身份验证的会话之间的区别仅在于您在Web服务器上本地指定特定用户已经过身份验证。

例如,一旦您对某人进行身份验证,您可以设置:

req.session.isAuthenticated = true;

然后,在渲染页面时,您的控制器可以执行类似

的操作
function(req, res, next) {
  if (!req.session.isAuthenticated) return res.redirect('/login');
  res.render('appPage');
}

答案 1 :(得分:2)

这可能不是您正在寻找的确切答案,但我会为未来的读者回答标题

通过试验我的应用程序,我发现express-session仅在您操作会话对象时设置会话cookie

例如,请考虑以下代码:

app.post('/login', function (req, res) {
  var authenticated = false;
  if (req.session.authenticated) {
    // session cookie is already set
    authenticated = true;
  } else if (/*validate the user here*/) {
    console.log(' authenticating');
    authenticated = true;
    // if below line executes, the response will have Set-Cookie header
    req.session.authenticated = authenticated;
  }
  res.json({
    status: authenticated
    //if --^ false, no session cookie will be set since we didn't manipulate session object
  });
 });

即使请求在内存中创建会话对象供我们使用,但只有在我们操纵(或篡改?)创建的会话对象时,才会发送Set-Cookie标头

除非我们将Set-Cookie标题与响应一起发送,并且会话ID存储在客户端的cookie中,否则我不会将其视为已建立的会话并担心它。

希望它有所帮助。

旁注:这是跨域ajax请求的情况,对于正常的http请求可能有所不同,也许有人可以确认这个