Laravel Sanctum CSRF Coo​​kie 请求可选

标签 laravel cookies csrf laravel-sanctum

我正在尝试将 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 Coo​​kie 请求可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61975282/

相关文章:

javascript - Asp.Net Core 2.1 请求排除客户端 cookie

php - 无法登录 mediawiki : canceled as a precaution against session hijacking?

javascript - 带有 csrf 的 Braintree webhooks 无法正常工作

php - Laravel Schedule 命令在带有 Sail 的 EC2 中不起作用

laravel - “Where like”子句使用 2 列的串联值与 Eloquent

cookies - 如果 Cookie 'Expires/Max-Age' 是 'N/A' 或未设置会发生什么

php - PHP中的CSRF(Cross-site request forgery)攻击示例和预防

javascript - 我无法在 Laravel 中使用条纹元素

php - Laravel Eloquent 计算

Javascript - 如果 cookie 存在,则有条件地将复选框添加到 php 页面