我正在尝试将 Laravel Sanctum 用于我的 SPA。有一些来自 web.php 路由的基本主页,但其他 axios
与 SPA 的 API 交互在 api.php 路由中,由 auth:sanctum
保护
根据官方文档(https://laravel.com/docs/7.x/sanctum#spa-authenticating),它说我们必须向/sanctum/csrf-cookie
发送请求。在登录前初始化 CSRF 保护。但是,我注意到即使没有登录,Laravel 默认情况下也已经初始化了 XSRF-TOKEN
和 <app_name>_session
cookies 到我的浏览器。我不需要通过 /sanctum/csrf-cookie
初始化它并且我在登录 SPA 中的后续 API 请求仍然有效。后来查了https://laravel.com/docs/7.x/csrf#csrf-x-xsrf-token它表示 Laravel 将在每个响应中包含 CSRF token 是默认行为。
我的问题是,/sanctum/csrf-cookie
是真的吗?初始化是可选的,对于 axios
是安全的使用 Laravel 返回的默认 CSRF token ?还是我做错了什么使我的 SPA 暴露于 CSRF 攻击?
最佳答案
您的主要 SPA 主页可能由您提到的 web.php
路由文件中定义的路由提供。在 App/Http/Kernel.php
中,检查您的中间件组是否有 VerifyCsrfToken::class
定义为 web
的中间件:
protected $middlewareGroups = [
'web' => [
...
StartSession::class,
...
VerifyCsrfToken::class,
...
]
]
此中间件负责创建 header 响应,例如:set-cookie XSRF-TOKEN=kgXZBZ4AccC0H17KEMw....
当您请求 web.php
中可用的任何路由时(如果 cookie 显然还不存在),那确实会初始化一个 XSRF-TOKEN
cookie。
因此,当您已经使用此VerifyCsrfToken
中间件时,您无需请求路由/sanctum/csrf-cookie
。
但是,如果您正在执行完全与 Laravel 后端完全分离的完整 SPA,并以不同的方式提供 html 页面,您将不会默认生成此 XSRF-TOKEN
cookie。因此,正如 Sanctum 文档中提到的,您需要请求 /sanctum/csrf-cookie
以在进一步操作之前生成 cookie。
关于Laravel Sanctum CSRF Cookie 请求可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61975282/