Set-Cookie header 未在测试环境中创建 cookie

Set-Cookie header not creating cookie in test environment

我有一个本地测试应用程序模仿端口 4200 上的主机 test.mywebsite.com

它调用 api.test.mywebsite.com(也是本地托管的)到 /login

请求通过,服务器 returns 200 和一些信息,以及它设置这个 header 我在响应中看到 headers:

Set-Cookie: refreshToken={JWT here}; expires=Sun, 23-May-2021 20:38:32 GMT; Max-Age=1296000; path=/; domain=.test.mywebsite.com; HttpOnly

这没有存储在我的浏览器(Chrome 或 Firefox)中,我正在尝试找出原因。

如果需要,这里有一些关于我的设置的更多信息: Angular 服务器使用 ng serve --host=test.mywebsite.comhttp://test.mywebsite.com:4200

上启动测试前端

localhost 上的 Kubernetes 后端 运行(我的主机文件将 api.test.mywebsite.com 重定向到 127.0.0.1),它将请求定向到创建的 PHP pod使用此代码的 cookie:

     setcookie(
        "refreshToken",          // name
        $refreshJWT->token,      // token
        $refreshJWT->expiration, // expires in 15 days
        '/',                     // path
        ".".$refreshJWT->domain, // domain
        ($refreshJWT->environmentType === "test") ? false : true, // security
        true                     // httponly
    );

我担心这是一件非常简单的事情,或者是某个地方的疏忽,但我这辈子都查不出是什么。我唯一能想到的是端口与 cookie 主机不匹配,但据我所知 cookie 域是 port-agnostic。我已经尝试将 :4200 添加到 cookie 域的末尾,但仍然有同样的问题。

更新:setcookie() returns true,因此在设置 header.

之前没有输出

更新 2:我将其部署到暂存服务器,尽管没有 DNS 欺骗或代理运行,但问题仍然存在。

Update3:我已经将它缩小到我的 api 服务器的 Access-Control-Allow-Origin header 和我的 JS 使用 withCredentials 的组合 我的 Access-Control-Allow-Origin 设置为 *。如果我将请求 withCredentials 作为 false 发送,它 returns 将 body 发送给 JS 但拒绝 cookie。如果我将 withCredentials 设置为 true,它会设置 cookie 但拒绝让 JS 读取 body.

It makes a call to api.test.mywebsite.com

...

domain=.test.mywebsite.com

这些主机名必须相同

我找到了原因,对于可能遇到此问题的任何人:

第一个问题是当我的请求正在处理并返回 200 时,cookie 没有被设置,因为我不同意在前端接收 cookie。要在前端同意 cookie,我必须使用 withCredentials.

第二个问题在后端,我没有明确发送 header Access-Control-Allow-Credentials 这将允许前端和后端同意 cookie 交换。

第三个问题是我的后端为 Access-Control-Allow-Origin 设置了通配符,如果使用 withCredentials,我的浏览器要求它与当前主机完全匹配。