我正在使用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中执行此操作?
答案 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
构建它。