0

我正在尝试将 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>_sessioncookie 到我的浏览器。我不需要通过初始化它,/sanctum/csrf-cookie并且我在登录 SPA 中的后续 API 请求仍然有效。后来我检查了https://laravel.com/docs/7.x/csrf#csrf-x-xsrf-token,它说 Laravel 将在每个响应中包含 CSRF 令牌是默认行为。

我的问题是,/sanctum/csrf-cookie初始化是否是可选的,并且axios使用 Laravel 返回的默认 CSRF 令牌是否安全?还是我做错了什么使我的 SPA 受到 CSRF 攻击?

4

1 回答 1

1

您的主要 SPA 主页可能由web.php您提到的路由文件中定义的路由提供。在App/Http/Kernel.php中,检查您的中间件组是否VerifyCsrfToken::class定义为中间件web

    protected $middlewareGroups = [
        'web' => [
            ...
            StartSession::class,
            ...
            VerifyCsrfToken::class,
            ...
        ]
    ]

该中间件负责创建标头响应,例如:set-cookie XSRF-TOKEN=kgXZBZ4AccC0H17KEMw....当您请求任何可用的路由时web.php(如果 cookie 显然不存在),这确实会初始化一个XSRF-TOKENcookie。

/sanctum/csrf-cookie因此,当您已经使用此VerifyCsrfToken中间件时,您不需要请求路由。

然而,如果你在做完全独立于你的 Laravel 后端的完整 SPA 并以不同的方式提供一个 html 页面,你将不会XSRF-TOKEN默认生成这个 cookie。因此,正如 Sanctum 文档中提到的,您需要/sanctum/csrf-cookie在进一步操作之前请求生成 cookie。

于 2020-11-05T10:19:41.213 回答