0

我正在使用 cookie-session 和 passportjs 来验证我的快速应用程序中的用户。当我像这样初始化我的 cookieSession 时:

app.use(cookieSession({
    maxAge: 24 * 60 * 60 * 1000,
    keys: ['key1']
}));

我的 cookie 已成功保存到客户端。但是,我正在进行的项目需要跨站点请求。因此,cookie 的secure 属性必须设置为true,SameSite 属性必须设置为none。在文档中,这些值可以设置如下:

app.use(cookieSession({
    maxAge: 24 * 60 * 60 * 1000,
    secure: true,
    sameSite: 'none',
    keys: ['key1']
}));

但是,当我这样做时,cookie 无法保存到客户端。我想知道是否有人知道如何解决此问题或为什么会发生这种情况?

先感谢您。

4

2 回答 2

1

Luka Darsalia的回答告诉我,至少在我的情况下,服务器拒绝向secure:true客户端发送 cookie,因为它认为客户端不安全(由于request.protocol存在http而不是https)。

起初我对此感到困惑,因为我的地址栏显示https. 但后来我记得那https只是我的浏览器和 Cloudflare CDN 之间的连接——Cloudflare CDN 和我的实际服务器之间的连接仍在使用http

因此,要修复它,我只需要确保cookie-session(更具体地说,cookie包中的这一行)连接是安全的,然后继续发送带有标志的 cookie。secure:true

为此,我只是在中间件之后添加了以下cookieSession中间件:

// your existing cookieSession init here
app.use(cookieSession({
    [...]
    secure: true,
    sameSite: "none",
}));

// enable the "secure" flag on the sessionCookies object
app.use((req, res, next)=>{
    req["sessionCookies"].secure = true;
    next();
});
于 2021-09-16T11:13:38.933 回答
0

认证后使用这个:

passport.authenticate("local");
   req.session.save((error) => {
     if (err) {
       console.log(err);
     } else {
       res.redirect("/");
      }
});
于 2021-06-22T21:13:20.950 回答