Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php “如何修复”;由于用户偏好,此集Cookie被阻止;镀铬的?(Stackoverflow SSO登录/Ajax CORS请求)_Php_Jquery_Google Chrome_Cross Domain - Fatal编程技术网

Php “如何修复”;由于用户偏好,此集Cookie被阻止;镀铬的?(Stackoverflow SSO登录/Ajax CORS请求)

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

Chrome最近更新到83.0.4103.116版,这似乎改变了Cookie的处理方式

我为我的用户提供一个单一登录,让他们登录到多个网站。与Stackoverflow类似,我正在使用Jquery执行以下操作:

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,
      ]);
   }
}