我有一個網站,React 前端位于(比方說)app.mydomain.com,而 api 位于 api.mydomain.com.
。用戶向 API 提交登錄請求,并在成功登錄后收到一個漂亮的 cookie,供以后使用。前端只與 API 直接對話,因此 cookie 上的域被簡單地設定為 api.mydomain.com。
我使用Axios來執行請求,并將withCredentials標志設定為true,以便接收cookie。
服務器上允許 CORS 的頭資訊如下:
Access-Customer-Customer-Customer
Access-Control-Allow-Origin: http://app.mydomain.com
Access-Control-Allow-Methods: get, post, delete, put, options
Access-Control-Allow-Headers: *
Access-Control-Allow-Credentials: true
在這種情況下,這是來自Firefox的回應:
但是,一旦Access-Control-Allow-Headers值被設定得更具體,比如說設定為
Access-Control-Allow-Headers。Origin, X-Requested-With, Content-Type, Accept,一切都能正常作業。
Mozilla 說他們不允許 "通配 "Origin 值,而不允許 Headers 值,同樣在這個頁面,沒有提到。
為什么Firefox會有這樣的行為,為什么在我能找到的任何地方都沒有提到它呢?
uj5u.com熱心網友回復:
在包括Access-Control-Allow-Credentials: true的預檢回應中,作為頭資訊Access-Control-Allow-Headers的值的星號會被字面解釋,而不是作為通配符(即 "允許所有頭資訊")。
主要的關于 CORS 的 MDN 頁面確實沒有明確說明這一規則。然而,更具體的關于Access-Control-Allow-Headers頭的MDN頁面則明確指出:
以下是更權威的Fetch 標準中的澄清性引文:值"
*"只作為一個特殊的通配符值,用于沒有憑證的請求(沒有HTTP cookie或HTTP認證資訊的請求)。在有憑證的請求中,它被視為字面頭名稱"*",沒有特殊語意。請注意,Authorization頭不能使用通配符,總是需要明確列出。
對于
Access-Control-Expose-Headers、Access-Control-Allow-Methods和Access-Control-Allow-Headers回應頭,值*可作為通配符用于沒有憑據的請求。
Access-Control-Expose-Headers、Access-Control-Allow-Methods和Access-Control-Allow-Headers回應頭只能使用*作為值當請求的憑證模式不是"include"。
(我的強調)
相關的規范性要求
規范中指出的對瀏覽器的相關規范性要求是在主要獲取演算法中的https://fetch.spec.whatwg.org/#main-fetch,在步驟13,子步驟2:
如果request的credentials模式不是 "include"并且headerNames包含*,那么將response的CORS-exposed header-name list設定為所有唯一的header response的名稱中的response的header串列。
換句話說,規范宣告對*要求的瀏覽器行為是:
- 如果憑證模式的
- 如果憑證模式不是"
include",則要求瀏覽器檢查回應中實際的回應頭串列,并允許所有的回應頭 。
- 如果憑證模式是"
include",則要求瀏覽器只允許任何具有字面名稱"*"的回應頭 。
在該步驟的末尾,實際上有一個說明,說的是差不多的事情:
在該步驟的末尾,有一個說明。
其中一個headerNames在這一點上仍然可以是
*,但只會匹配一個名字是*的頭。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/320702.html
標籤:
上一篇:如何在Python中用Selenium和Firefox下載檔案?
下一篇:如何從網頁抓取中添加到索引
