
如何从一个域重定向到另一个域并为另一个域设置 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,并在目标域上启用明确的来源规范服务器端。