Php “如何修复”;由于用户偏好,此集Cookie被阻止;镀铬的?(Stackoverflow SSO登录/Ajax CORS请求)
Chrome最近更新到83.0.4103.116版,这似乎改变了Cookie的处理方式 我为我的用户提供一个单一登录,让他们登录到多个网站。与Stackoverflow类似,我正在使用Jquery执行以下操作:Php “如何修复”;由于用户偏好,此集Cookie被阻止;镀铬的?(Stackoverflow SSO登录/Ajax CORS请求),php,jquery,google-chrome,cross-domain,Php,Jquery,Google Chrome,Cross Domain,Chrome最近更新到83.0.4103.116版,这似乎改变了Cookie的处理方式 我为我的用户提供一个单一登录,让他们登录到多个网站。与Stackoverflow类似,我正在使用Jquery执行以下操作: crossDomain: true, xhrFields: { withCredentials: true }, 在PHP中,我允许域: // needed for cross-domain request header('Access-Control-Allow-Origin: h
crossDomain: true,
xhrFields: { withCredentials: true },
在PHP中,我允许域:
// needed for cross-domain request
header('Access-Control-Allow-Origin: https://www.example.com');
header('Access-Control-Allow-Credentials: true');
然而,现在它不再工作了
在开发人员控制台中,我发现了一个带有工具提示的新警告:
“由于用户首选项,此集Cookie被阻止”
如何解决这个问题
更新: 我只是看到Stackoverflow的单点登录也不起作用了
PS:建议告诉你的用户更改Chrome设置,从我的观点来看,我希望避免这种情况。试想一下,通知数百万用户启用cookie进行单点登录…传递
设置cookie
HTTP头的站点也需要传递SameSite
作为无和安全
,否则cookie不会被保存并被忽略
Set-Cookie: qa_session=...; SameSite=None; Secure
在此之前,请阅读安全提示:
PHP代码示例():
函数setcookieSameSite($name、$value、$expire、$path、$domain、$secure、$httponly、$samesite=“None”)
{
如果(PHP_版本_ID<70300){
setcookie($name、$value、$expire、“$path;samesite=$samesite”、$domain、$secure、$httponly);
}
否则{
setcookie($name,$value[
'expires'=>$expire,
“路径”=>$path,
“域”=>$domain,
“samesite”=>$samesite,
“安全”=>$secure,
“httponly”=>$httponly,
]);
}
}
如果你只能在匿名模式下复制这一点,而Pierre Pretorius的回答没有帮助,那么你可能会被Chrome 83中的一个变化所影响,在匿名模式下,第三方cookie被默认阻止。看
我认为你无法改变这一点,谷歌打算在未来将此作为默认行为:这是由于cookie处理方面的重大变化,以帮助缓解CSRF。
在本草案之后:
上面的解决方法将不起作用(函数setcookieSameSite),因为您需要在会话标识符上设置samesite标志(我可以看到PHPSESSID也有此消息,即“此设置Cookie由于用户首选项而被阻止”)。或者尝试会话设置cookie参数路径?(未经测试)
在php5.6分支中,您需要设置会话的cookie属性
顺便说一句,你截图中的qa_会话cookie似乎是一个随机cookie,对于这个cookie,可以使用@Pierre Pretorius answer,它会起作用
对于PHP5.6.40,请参见我的另一个答案:@Jay Blanchard:我明确表示这与更改Chrome设置无关(这是另一个问题中公认的答案)。它不涉及单点登录、Ajax和PHP请不要客气,去掉关闭标志。你有没有研究过所有的副本,发现没有一个是属于你的?当然。例如,或谷歌。。。再说一次,只是为了指出其重要性,所有SO/Stackexchange用户都将受到影响。Chrome中的clean install默认设置似乎是阻止第三方Cookie(all)。在以后的版本更新中,这可能是对其SameSite需求的提升。我想这是为了保护用户不受自己的影响,当chrome确定您自己的cookie之一是第三方cookie(cookie集来自非当前域的域)时,这确实会带来一点问题。@FunkFortyNiner不,我们需要一个技术解决方案。在接下来的几天里,将会有很多网站/开发者遇到同样的问题。不过,我的浏览器还是不喜欢某些东西。cookie如下所示:Set cookie:JSESSIONID=somevaluehere;路径=/我的站点路径;SameSite=无;安全,但浏览器仍表示不想设置它。注意:re/rsp在iframe中。我已经修复了它:问题是我在Chrome中以匿名模式进行测试。此外,Chrome中有一个默认设置,指定匿名模式不应接受第三方cookie。因此,我已经启用了该选项,cookies现在已保存。对于PHP5.6.40,如果重建PHP二进制文件没有问题,我设法将此功能从PHP7.3移植到PHP5.6.40,现在有一个pull请求。请参见此处的完整答案:
function setcookieSameSite($name, $value, $expire, $path, $domain, $secure, $httponly, $samesite="None")
{
if (PHP_VERSION_ID < 70300) {
setcookie($name, $value, $expire, "$path; samesite=$samesite", $domain, $secure, $httponly);
}
else {
setcookie($name, $value, [
'expires' => $expire,
'path' => $path,
'domain' => $domain,
'samesite' => $samesite,
'secure' => $secure,
'httponly' => $httponly,
]);
}
}