【问题标题】:Set-Cookie header not creating cookie in test environmentSet-Cookie 标头未在测试环境中创建 cookie
【发布时间】:2021-07-30 18:40:24
【问题描述】:

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

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

请求通过,服务器返回 200 和一些信息,并随之设置此标头,我在响应标头中看到:

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.com 在http://test.mywebsite.com:4200 上获取测试前端

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

     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 域与端口无关。无论如何,我已经尝试将:4200 添加到 cookie 域的末尾,但仍然遇到同样的问题。

更新:setcookie() 返回 true,因此在设置标头之前没有输出。

更新 2:我将它部署到临时服务器,尽管没有发生 DNS 欺骗或代理,但问题仍然存在。

Update3:我已将其范围缩小为我的 api 服务器的 Access-Control-Allow-Origin 标头和我的 JS 对 withCredentials 的使用的组合 我的Access-Control-Allow-Origin 设置为*。如果我将请求withCredentials 作为false 发送,它会将正文返回给JS,但拒绝cookie。如果我将withCredentials 设置为true,它会设置cookie 但拒绝让JS 读取正文。

【问题讨论】:

    标签: php angular cookies setcookie


    【解决方案1】:

    它调用 api.test.mywebsite.com

    ...

    domain=.test.mywebsite.com

    这些必须是相同的主机名

    【讨论】:

    • 啊,很好。不幸的是,我已将 cookie 主机名更改为 .api.test.mywebsite.com,但它似乎仍然没有将 cookie 存储或附加到对 api.test.mywebsite.com 的后续请求中
    • 现在我深入研究了它,为什么它们需要是相同的主机名? RFC2109 给出的例子是 * A Set-Cookie from request-host x.foo.com for Domain=.foo.com would be accepted. 在这里不适用吗?
    • 测试有这么难吗?
    • 正如我在第一条评论中所说的,我已经测试过了,它不起作用。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      相关资源
      最近更新 更多