Laravel 8 Sanctum SPA Auth -会话存储未按要求设置

hc8w905p  于 2023-11-20  发布在  其他
关注(0)|答案(7)|浏览(146)

我正在尝试实现Sancutum SPA身份验证。在尝试登录时收到以下错误(* 仅限生产环境 *):
第一个月
遵循文档中的所有步骤。首先调用sanctum/csrf-cookie GET请求,然后调用我的API login POST请求,并附上会话cookie。感谢您提供的任何提示!
我的AuthController.php中的login方法,异常发生在第28行。
x1c 0d1x的数据
我的Http\Kernel.php文件和API端点的中间件。“



routes/api.php中的我的API端点


8yparm6h

8yparm6h1#

添加StartSessionapp/Http/Kernel.php:

protected $middleware = [
        ...
        \Illuminate\Session\Middleware\StartSession::class,
    ];

字符串
对我很有效

7xzttuei

7xzttuei2#

对于未来的你,解决问题的正确方法是:
1.发布Sanctum配置
第一个月
1.通知您的应用/API中间件在正确的路由组(API,web,e.t.c)下的app/Http/Kernel.php上添加EnsureFrontendRequestsAreStateful类,以利用有状态会话

'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
...

字符串

以下两个步骤非常重要

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

xurqigkl

xurqigkl3#

'api' => [
    \App\Http\Middleware\EncryptCookies::class,
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,

    \Illuminate\Session\Middleware\StartSession::class, // Add this line
],

字符串
StartSession.php是一个会话管理器,它处理来自每个API请求会话。

klsxnrf1

klsxnrf14#

在.env文件中检查APP_URL={your app base url}是否正确。

anhgbhbe

anhgbhbe5#

app/Http/Middleware/Authenticate.php中添加了if (!$request->is('api/*') && $request->session()->all())由于验证中间件检查会话,请求崩溃,因此这有助于. P.S此修复sanctum使用.

jyztefdp

jyztefdp6#

对于Laravel 10.X在SPA配置的情况下,设法解决了这个问题,根据文档https://laravel.com/docs/10.x/sanctum#spa-configurationwithoutapp/Http/Kernel.php'api'中间件组中添加\Illuminate\Session\Middleware\StartSession::class,正如一些评论中所建议的那样。
让它对我起作用的是从前端指定一个origin request header,它与'stateful' config中定义的任何app/config/sanctum.php有状态域完全匹配:

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
        '%s%s',
        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
        Sanctum::currentApplicationUrlWithPort()
    ))),

字符串
origin header不匹配将导致帖子中的错误。确保请求origin(或referer)header与.env文件中的SANCTUM_STATEFUL_DOMAINSAPI_URL匹配,正如这里的一些评论者所建议的那样。如果您在头中包含端口,请确保将其添加到SANCTUM_STATEFUL_DOMAINSAPI_URL配置中。
例如,使用APP_URL=http://localhost的配置将接受origin='localhost',但不接受origin='localhost:8000'

附加信息:

该错误可能源于\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class中间件未通过fromFrontend()检查(由于域和配置不匹配),这将不会加载必要的会话中间件。成功加载将添加StartSession中间件,但包括其他必要的中间件,如果直接将中间件添加到api部分,则可能会丢失这些中间件。
来自用户dcon123的更多信息:https://laracasts.com/discuss/channels/laravel/sanctum-throws-session-store-not-set-on-request?page=1&replyId=871059

scyqe7ek

scyqe7ek7#

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

相关问题