KHa*_*sen 5 javascript cookies attributes fetch
我正在尝试在 javascript 获取 CORS 请求中将 Cookie 发送到 PHP 脚本。请求开始https://sub1.example.com并包含以下选项:
let response = await fetch('https://sub2.example.com/target.php', {
method: "POST",
headers: headers,
body: formData,
mode: 'cors',
credentials: 'include',
cache: 'no-store'
});
Run Code Online (Sandbox Code Playgroud)
相应的 PHP 脚本设置以下 headers:
header('Access-Control-Allow-Origin: https://www.example.com');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Request-With, Set-Cookie, Cookie, Bearer');
Run Code Online (Sandbox Code Playgroud)
但 Cookie 标头不随请求一起发送。我也尝试过:
let headers = new Headers();
headers.set('Cookie', document.cookie);
Run Code Online (Sandbox Code Playgroud)
这也没有效果。我到底做错了什么?
我检查了开发工具中的网络选项卡。$_COOKIEPHP脚本中也是空的。绝对没有错误。我还可以看到 Cookie 标头是在任何非 CORSfetch请求中发送的。
编辑:以下是其中一项 Cookie 的设置:
Name: PHPSESSID
Path: /
Secure: true
SameSite: none
Run Code Online (Sandbox Code Playgroud)
我无法共享域名,因为它不是公开的。但 Cookie 域与请求标头中的 Origin 具有相同的值(减去 https://)。
编辑 2:更改了获取 URL 以更清楚地了解发生的情况。
请注意,取决于
Path属性的值,Domain,Secure属性的值,SameSitecookie属性的有效值,cookie 可能附加到请求,也可能不附加到请求。与您的案例特别相关的是Domain属性;查看有关该主题的 MDN 页面:
该
Domain属性指定哪些主机可以接收 cookie。如果未指定,该属性默认为设置 cookie 的同一主机,不包括 subdomains。如果Domain指定,则始终包含子域。因此,指定的Domain限制性比省略的限制要小。但是,当子域需要共享有关用户的信息时,它会很有帮助。
您在 origin 上按如下方式设置 cookie https://sub1.example.com:
Set-Cookie: PHPSESSID=whatever; Path=/; SameSite=None; Secure
Run Code Online (Sandbox Code Playgroud)
因此,该 cookie 将附加到目标来源为 的(经过验证的)请求https://sub1.example.com,而不是其他请求。
如果您希望将 cookie 发送到其域是子example.com域的所有安全源,则需要将其显式设置Domain为example.com.
fetchFetch 标准指定了禁止的标头名称列表;Cookie是其中之一。Cookie您不能设置以 ;发送的请求上命名的标头fetch。标准只是禁止它。如果要将现有 cookie 附加到跨源请求,请使用选项中传递的参数'include'值credentialsfetch。
| 归档时间: |
|
| 查看次数: |
14078 次 |
| 最近记录: |