4

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

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

但是只有在成功认证后我才能创建会话。我用谷歌搜索了一下,发现req.session.regenerate()(但我发现这个线程中提到的问题如下: Regenerate session IDs with Nodejs Connect

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

那么只有在成功认证后才能创建新的会话ID..?

4

2 回答 2

3

您可能将会话的概念与经过身份验证的会话的概念混为一谈

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

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

req.session.isAuthenticated = true;

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

function(req, res, next) {
  if (!req.session.isAuthenticated) return res.redirect('/login');
  res.render('appPage');
}
于 2013-01-28T05:17:05.190 回答
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请求可能会有所不同,也许有人可以确认这一点

于 2015-11-26T12:52:34.233 回答