首页 > 解决方案 > 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 之外,有没有办法解决这个问题?

标签: symfonycookiessymfony-3.2

解决方案


来自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


推荐阅读