Laravel 8 Sanctum SPA Auth - 未根据请求设置会话存储

fro*_*ton 7 authentication laravel single-page-application laravel-sanctum laravel-8

我正在尝试实施 Sanctum SPA 身份验证。尝试登录时出现以下错误(仅在生产中):

production.ERROR: Session store not set on request. {"userId":1,"exception":"[object] (RuntimeException(code: 0): Session store not set on request. at /app/vendor/laravel/framework/src/Illuminate/Http/Request.php:483)

遵循文档中的所有步骤。首先调用GET 请求,然后调用附加会话 cookie 的sanctum/csrf-cookieAPI POST 请求。login感谢您的任何提示!

我的login方法在 中AuthController.php,异常发生在第 28 行。

在此输入图像描述

我的Http\Kernel.php文件包含 API 端点的中间件。

在此输入图像描述

我的 API 端点位于routes/api.php

在此输入图像描述

小智 24

添加StartSessionapp/Http/Kernel.php:

protected $middleware = [
        ...
        \Illuminate\Session\Middleware\StartSession::class,
    ];
Run Code Online (Sandbox Code Playgroud)

它对我有用。

  • 但为什么?文档没有说明任何内容,为什么我必须这样做? (6认同)

小智 6

对于未来的您,解决问题的正确方法是:

  1. 发布 Sanctum 配置

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

  1. 通过在正确的路由组(api、web 等)下添加EnsureFrontendRequestsAreStateful类,通知您的应用程序/api 中间件利用有状态会话app/Http/Kernel.php
'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
...  
Run Code Online (Sandbox Code Playgroud)

以下两步非常关键

  1. 添加允许使用 Sanctum SPA 会话的前端域/IP 地址。SANCTUM_STATEFUL_DOMAINS这可以通过在文件中添加密钥.env或修改文件中的有状态密钥的值来完成config/sanctum.php
  1. 对于受 sainttum 中间件保护的端点的每个请求,它必须包含originreferer标头。此外,X-XSRF-TOKEN如果适用,请包含标头。


fro*_*ton -7

身份验证路由必须位于routes/web.php文件中。