如何修复随机重置会话令牌的 Safari 16.4 会话错误?

问题描述 投票:0回答:1

Safari v16.4 (MacOS) 的最新更新不会在我维护的 Laravel (PHP) 应用程序中维护会话,它会随机注销用户并且不会维护购物车中的项目。

这是在 Apple 开发者论坛中报告的 - https://developer.apple.com/forums/thread/728137 这里有一个 Webkit 错误报告 - https://bugs.webkit.org/show_bug.cgi? id=255524,但据我所知没有解决方法。

Webkit 票证中提到的一种可能的解决方法是将 SameSite 属性从“松散”更改为“无”,这修复了 Safari 上的问题,但破坏了最新版本的 Chrome 上的会话行为,通常不推荐使用。

我们处理会话或 cookie 的方式是否有另一种方法可以解决此问题,或者这是否真的是一个 Webkit 错误,在通过 Safari 更新解决问题之前无法解决?

php laravel session safari webkit
1个回答
0
投票

虽然这并不理想,但您可以将 SameSite 配置为仅针对有问题的 Safari 实现:

首先覆盖内置的StartSession中间件。

namespace App\Http\Middleware;

use Illuminate\Session\Middleware\StartSession as FrameworkStartSession;

class StartSession extends FrameworkStartSession {
    protected function addCookieToResponse(Response $response, Session $session)
    {
        // Maybe use something a bit more sophisticated here like e.g. detecting only the buggy versions
        if (Str::contains(request()->server('HTTP_USER_AGENT'), 'Safari')) { 
           config([ 'session.same_site' => 'none' ]);
        }
        return parent::addCookieToResponse($response, $session);
    }
}

然后在您的

app/Http/Kernel.php
中用您自己的覆盖替换
StartSession
下的
web
中间件。

这应该让其他浏览器像以前一样运行。

您也可以将相同的逻辑放在服务提供者中,但如果您使用的是 Laravel Octane,那将不起作用。中间件应该适用于所有情况。

© www.soinside.com 2019 - 2024. All rights reserved.