尽管凭据未发送 Cookie:"include"

Cookies not being sent despite credentials: "include"

我在后端使用 express,在前端使用 react。我正在使用 cors 从 passport.js GoogleOAuth 获取用户详细信息。我正在使用 Heroku 在两个不同的域中托管前端和后端。客户端中的请求如下所示:

fetchAuthUser = async () => {
    const metadata = {
      headers : {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      },
      referrerPolicy: "strict-origin-when-cross-origin",
      body: null,
      method: "GET",
      mode: "cors",
      credentials: "include"
    }
    
    const response = await fetch(Env.backend_host +'/authenticate_google/api/current_user', metadata).catch((err) => {
        console.log(err)
    });

    console.log(response);

    if (response && response.data) {
      this.setState({user: eval(response.data)}, () => {this.loadPages()});
    }
  }

目前服务器设置如下:

cookies是这样设置的,

router.use(
  cookieSession({
    maxAge: 30 * 24 * 60 * 60 * 1000, // sets cookie to expire in 30 days (converted to milliseconds)
    keys: ["trialkey"],
    sameSite: "lax",
  })
);

获取响应如下

router.get("/api/current_user", cors({ origin: "https://energycast-front.herokuapp.com", methods: ['GET','POST','OPTIONS'], credentials: true, preflightContinue: true}), (req, res) => {

    console.log("User:" +req.user)

    res.json(req.user);
 
  });

问题似乎与 cors 无关,但是在观察请求时,我发现没有发送任何 cookie。这很奇怪,因为我设置了凭据“include”。

注意,控制台正在记录服务器本身未定义的“用户”。

我们将不胜感激。

如果请求来自不同的站点并且不是由顶级导航(而是通过 fetch 语句)发起的,则带有 SameSite=Lax 的 Cookie 将被阻止。

尝试使用 sameSite: "None"

该 cookie 也可能被阻止,因为它违反了您浏览器中的第三方 cookie 设置。

我已经弄清楚出了什么问题,问题出在 cookie-session 上。当 cookie 设置为 sameSite = 'none' 时,网络工具将拾取它并且 return 必须将安全错误设置为 true。但是,在将 secure 设置为 true 后,网络调试工具恢复为说 samesite 设置为“Lax”并且无法发送 cookie。

因此我已经切换到 express-cookie 包:

router.set('trust proxy', 1) // trust first proxy
router.use(
  session({
    secret: SECRET,
    resave: false,
    saveUninitialized: true,
    cookie: { 
      secure: true,
      sameSite: "none"
    }
  })
);