Javascript 使用CORS访问HTTP Cookie
我有一个用户在域a上。当他们向域a发出请求时,我希望域a联系域B。一旦请求到达域B,我希望域B访问用户在域B上而不是在域a上的HTTP Cookies。这是否可能与CORS有关 因此,我们需要重新讨论Javascript 使用CORS访问HTTP Cookie,javascript,php,http,cookies,cors,Javascript,Php,Http,Cookies,Cors,我有一个用户在域a上。当他们向域a发出请求时,我希望域a联系域B。一旦请求到达域B,我希望域B访问用户在域B上而不是在域a上的HTTP Cookies。这是否可能与CORS有关 因此,我们需要重新讨论 用户访问www.example.com 跨域请求来自www.example.com->www.example.net www.example.net为请求用户检查www.example.net上的HTTP cookie,而不是www.example.com 显然,开箱即用的方法是行不通的。我正在寻
www.example.com
www.example.com
->www.example.net
www.example.net
为请求用户检查www.example.net
上的HTTP cookie,而不是www.example.com
www.example.com
和www.example.net
,当用户访问www.example.com
时,如果他们在www.example.net
上设置了特定的HTTP Cookie,我想登录到www.example.net
数据库
更新
我已经在测试服务器端脚本上设置了CORS(www.example.net
用于此示例):
没有任何CORS错误。如果我直接在浏览器中访问服务器端脚本,我会看到客户端HTTP cookie的正确转储。但是,当
www.example.com
被加载时,它们不会被转储。这意味着我不能在我的服务器上做我需要做的事情,www.example.net
,因为$\u COOKIE
数组是空的。在example.com
中,我们有一个带有iframe的页面,它从example.net
加载页面
index.html:
<!DOCTYPE html>
<html lang="en">
<body>
<iframe src="http://example.net/log.php"></iframe>
</body>
</html>
一些注意事项:
在我的开发环境(Win10,Chrome 87)中,Chrome避免跨站点cookie。Chrome 80+在set cookie中添加了一个新属性,名为SameSite
,用于改善隐私
在您的情况下,此选项必须是None
像这样SameSite=None
并且您的域必须是https
简而言之,set cookie命令应该有。。。保护SameSite=None
例如:
header("Set-Cookie: key=value; path=/; domain=example.net; Secure; SameSite=None");
在我的开发环境中,我没有https域,因此我为我的测试禁用chrome SameSite如果您设置了跨源请求,那么将包括请求所针对的URL的cookie。但是,这将在设置包括凭据的请求之前触发一个错误
fetch("//example.net/", {
method: 'GET',
credentials: 'include'
});
您是否尝试使用iframe?在
example.com
中,生成一个动态iframe,其中src toexample.net
并附加到正文中,然后您可以访问example.net
cookies@Lessmore我需要更多信息才能测试此功能。若要尝试阅读访问控制允许源代码:*我们在服务器nginx上进行了此配置(或apache)您是否尝试了我的解决方案(iframe)?我认为这也可以,但当我在服务器上转储cookie时,它不会显示任何cookie。如果我直接访问服务器端脚本,cookie就在那里。没有CORS错误。
<?php
$visits = isset($_COOKIE['visits']) ? intval($_COOKIE['visits']) : 0;
var_dump($_COOKIE);
$visits += 1;
setcookie('visits', $visits, time() + 3600);
header("Set-Cookie: key=value; path=/; domain=example.net; Secure; SameSite=None");
fetch("//example.net/", {
method: 'GET',
credentials: 'include'
});