[英]Javascript fetch is not sending Cookie Header (CORS)
我正在嘗試將 Cookies 發送到 javascript 獲取 Z5A8FEFF0B4BDE3EEC9244B76023 請求中的 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'
});
相應的 PHP 腳本設置以下標頭:
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');
但是 Cookie Header 不會隨請求一起發送。 我也試過:
let headers = new Headers();
headers.set('Cookie', document.cookie);
那也沒有效果。 我在這里到底做錯了什么?
我檢查了開發工具中的網絡選項卡。 PHP 腳本中的$_COOKIE
也是空的。 絕對沒有錯誤。 我還可以看到 Cookie Header 是在任何非 CORS fetch
請求中發送的。
編輯:這是 Cookies 之一的設置:
Name: PHPSESSID
Path: /
Secure: true
SameSite: none
我無法共享域,因為它不是公開的。 但是 Cookie 域與請求 Header 中的 Origin 具有相同的值(減去 https://)。
編輯 2:更改了 fetch URL 以使發生的事情更清楚。
請注意,取決於
Path
屬性的值,Domain
屬性的值,Secure
屬性的值,SameSite
屬性的有效值, cookie 可能會或可能不會附加到請求。 與您的案例特別相關的是Domain
屬性; 查看MDN 的主題頁面:
Domain
屬性指定哪些主機可以接收 cookie。 如果未指定,則該屬性默認為設置 cookie 的同一主機,不包括 subdomains 。 如果指定了Domain
,則始終包含子域。 因此,指定Domain
比省略它的限制要小。 但是,當子域需要共享有關用戶的信息時,它會很有幫助。
您在原點https://sub1.example.com
上設置 cookie 如下:
Set-Cookie: PHPSESSID=whatever; Path=/; SameSite=None; Secure
因此,該 cookie 將附加到目標來源為https://sub1.example.com
的(經過認證的)請求,而不是其他請求。
如果您希望將 cookie 發送到其域為example.com
子域的所有安全源,則需要將其Domain
顯式設置為example.com
。
fetch
發送 cookies Fetch 標准指定了一個禁止的 header 名稱列表; Cookie
就是其中之一。 您不能在使用fetch
發送的請求上設置名為Cookie
的 header ; 標准只是禁止它。 如果要將現有的 cookies 附加到跨域請求,請使用fetch
選項中傳遞的credentials
參數的'include'
值。
Cookies 通常不應該附加到 CORS 模式下的預檢請求。 你可能想看看這個。
注意:無論此設置如何,瀏覽器都不應在預檢請求中發送憑據。 有關詳細信息,請參閱:CORS > 帶有憑據的請求。
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.