Laravel在子域名上忽略父Cookie时

enxuqcxy  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(114)

我在父域上有一个laravel应用程序。SESSION_DOMAIN被设置为.domain.com,因为我希望cookie与另一个子域first.domain.com共享。
我现在想在second.domain.com上发布另一个应用程序,它与domain.comfirst.domain.com分开。
第二个应用程序的SESSION_DOMAIN正确设置为second.domain.com
每次我尝试通过sanctum登录时,都会收到错误CSRF token mismatch
我很确定这是由于多个域上的多个cookie,因为如果我清除父domain.com的cookie或使用隐身模式或其他浏览器,那么问题就消失了。
仅当.domain.comsecond.domain.com都设置了XSRF-TOKEN cookie令牌时,才会出现此问题。
其他一切似乎都很好,大概是因为Laravel使用的另一个cookie _session是以应用程序名称为前缀的,因此是唯一的。
XSRF-TOKEN通常被称为XSRF-TOKEN
我如何设置它,使我的父域可以与first.domain.com共享cookie,但不干扰second.domain.com

9vw9lbht

9vw9lbht1#

我想出了一个可行的办法。
通过将以下内容添加到正在渲染SPA的刀片模板中。

<meta name="csrf-token" content="{{ csrf_token() }}">

然后在初始化Axios时(这是在默认的Laravel设置中的bootstrap.js中)添加crsf-token作为默认头。

window.axios.defaults.headers.common['X-CSRF-TOKEN'] = document.querySelector('meta[name="csrf-token"]').getAttribute('content');

这绕过了cookie,你可以在Laravel的VerifyCsrfToken中看到,它首先检查这个头文件(实际上,你也可以将_token作为GET或POST参数发送)。
https://github.com/laravel/framework/blob/4ffac6f71467562dbe670f893af787bf5c610103/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php#L151
我发现的一个问题是,当你退出Sanctum时,你通常想重置令牌。
最好的办法是在Logout响应中返回csrf_token(),然后更新类似于上面的标题。
例如:

/**
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout(Request $request): JsonResponse
    {
        Auth::guard('web')->logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();
        return response()->json([
            'message' => 'You have been logged out.',
            'csrf_token' => csrf_token()
        ]);
    }
axios.post('/api/auth/logout').then(response => {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = response.data.csrf_token
})

我希望这能帮助其他有同样问题的人!

相关问题