将登录用户重定向到Express中的https?

时间:2013-03-20 20:09:20

标签: node.js express passport.js

我正在使用PassportJS的用户名/密码策略来验证我网站上的用户。我确保用户必须通过HTTPS登录,并确保会话cookie仅通过HTTPS发送:

app.use(express.session({
    // ...
    cookie: { secure:true }
}));

但现在,如果有人登录(通过HTTPS),然后通过HTTP返回网站,看起来他们没有登录,因为他们的浏览器不会发送cookie。

我想将登录用户重定向到HTTPS。

我认为我需要发出两个Cookie:一个包含会话详细信息(标记为secure: true),另一个只显示“您已登录”(标记为secure: false)。如果我通过HTTP看到第二个cookie,我可以重定向到HTTPS,并且将发送安全cookie。 Presto:登录用户被重定向到HTTPS。

问题:如何在Express中执行此操作?

2 个答案:

答案 0 :(得分:1)

当有人通过HTTPS访问网站时,添加Strict-Transport-Security header。这将导致他们的浏览器在下次访问该站点时自动将HTTP重写为HTTPS。

app.use(function(req, res, next) {
    if (req.secure()) {
        res.header('Strict-Transport-Security', 'max-age=31536000');
    }

    next();
});

答案 1 :(得分:0)

当用户成功登录时,请设置一个cookie:

res.cookie('loggedin', '1', { secure : false /*, other options */ });

接下来,使用检查该cookie的中间件:

app.use(function(req, res, next) {
  if (req.cookie.loggedin === '1' && ! req.secure())
  {
    res.redirect(HTTPS_LOCATION);
  }
  else
  {
    next();
  }
});

HTTPS_LOCATION的值取决于您的设置,但您可以使用req.path构建它。