symfony - Symfony 3.2、身份验证和跨站点 cookie
问题描述
我知道 Symfony 3.2 维护的时间不长,但碰巧我的公司正在使用它。现在我们遇到了身份验证问题。我们有可以(并且已经)安装在多个站点上的小部件,因此用户可以在那里登录。但是 Symfony 3.2 中的数据库和后端代码存储在我们的站点中。对于身份验证,我们使用标准的 Symfony cookie,在我们的例子中是跨站点的。但是现在谷歌浏览器被限制访问没有标记为 SameSite=None 的跨域 cookie。因此 Chrome 中的身份验证不再起作用。我知道在 Symfony 4.2 中我可以通过在 security.yaml 中设置安全参数来解决这个问题。但在 Symfony 3.2 中它不起作用。除了升级到 Symfony 4 之外,有没有办法解决这个问题?
解决方案
来自https://github.com/GoogleChromeLabs/samesite-examples/blob/master/php.md
自 PHP 7.3.0 起,该
setcookie()
方法支持SameSite
其选项中的属性,并将接受None
为有效值。
// Set a same-site cookie for first-party contexts
setcookie('cookie1', 'value1', ['samesite' => 'Lax']);
// Set a cross-site cookie for third-party contexts
setcookie('cookie2', 'value2', ['samesite' => 'None', 'secure' => true]);
对于早期版本的 PHP,也可以
header()
直接设置:
// Set a same-site cookie for first-party contexts
header('Set-Cookie: cookie1=value1; SameSite=Lax', false);
// Set a cross-site cookie for third-party contexts
header('Set-Cookie: cookie2=value2; SameSite=None; Secure', false);
对于 Session Cookie ,您可以设置成session_set_cookie_params
方法。PHP 7.3.0 为相同站点引入了新属性。
if (PHP_VERSION_ID >= 70300) {
session_set_cookie_params([
'lifetime' => $cookie_timeout,
'path' => '/',
'domain' => $cookie_domain,
'secure' => $session_secure,
'httponly' => $cookie_httponly,
'samesite' => 'Lax'
]);
} else {
session_set_cookie_params(
$cookie_timeout,
'/; samesite=Lax',
$cookie_domain,
$session_secure,
$cookie_httponly
);
}
在 PHP 5.4.0+ 上有第三方包,例如enjoy-im/PHP-Cookie,它支持SameSite
属性和值(从 v3.2 开始)。None
推荐阅读
- android - Android,如果用户删除 SD 卡上的 SAF 树 uri(文件夹)。无法创建相同的文件夹
- azure-devops - 当“更改已经存在”时如何修复 YAML 文件转换任务?
- apache-spark-sql - 在 PowerQuery 中更新源:通过 ODBC 提取 Azure 数据
- r - 从 KableExtra 表对象以 R 笔记本格式正确呈现数学符号
- flutter - 如何确定一个偏移量是否包含在另一个偏移量区域中?
- c# - 在 SQL Server 中获取一组值
- google-chrome - 如何将“允许下载”添加到沙盒属性列表
- c++ - 无论如何将 WebView 或任何其他相同的对象包含到 c++ 项目中?
- android - 为 android x86 和 x86_64 架构编译 ijkplayer x264,错误:未知类型名称“v4si”
- c++ - 不可访问的虚函数的模糊访问