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.com
在 http://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
,我的浏览器要求它与当前主机完全匹配。
我有一个本地测试应用程序模仿端口 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.com
在 http://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
,我的浏览器要求它与当前主机完全匹配。