
如何從一個網域重新導向到另一個網域並為另一個網域設定 Cookie 或標頭?
HTTP 重定向不允許為目標設定自訂標頭或 Cookie領域。此外,瀏覽器會封鎖為與使用 Set-Cookie 標頭回應的網域不同的網域設定 Cookie。
解決方案 1:使用查詢參數重新導向,然後設定 Cookie
- 重新導向自網域 A 到網域 B,並將存取權杖作為查詢參數傳遞。
- 域 B 接收請求並使用令牌設定自己的 cookie。
解決方案 2:跨源與 Window.postMessage() 通訊
- 向域 A 新增一個指向域 B 的隱藏 iframe。
- 使用 Window.postMessage() 將存取權杖傳送至網域 B。
- 域 B 將令牌儲存在 localStorage 中或使用 JS 設定 cookie。
- 向域 A 發送令牌已儲存的訊息,並將使用者重新導向至網域 B。
解決方案 3:伺服器端令牌交換
- 在網域 A 中使用
標記指向網域 B,並以存取權杖作為查詢參數。 - 域 B 回應收到請求後設定 Cookie 標頭。
- 使用 fetch 或 XMLHttpRequest(啟用憑證和 CORS)將代幣直接傳送到網域 B。
- 域B 收到存取權限後設定cookie token.
重要說明:
- 必須在瀏覽器設定中啟用所有cookie,解決方案2 和3 才能運作。
- 使用 SameSite=無;解決方案 3 的 cookie 中的安全標誌。
- 解決方案 1 中的查詢字串會公開存取權杖並帶來安全風險。
- 解決方案 3 需要在目標網域上啟用 CORS,並在目標網域上啟用明確的來源規格伺服器端。