我正在尝试实现Sancutum SPA身份验证。在尝试登录时收到以下错误(* 仅限生产环境 *):
第一个月
遵循文档中的所有步骤。首先调用sanctum/csrf-cookie
GET请求,然后调用我的API login
POST请求,并附上会话cookie。感谢您提供的任何提示!
我的AuthController.php
中的login
方法,异常发生在第28行。
x1c 0d1x的数据
我的Http\Kernel.php
文件和API端点的中间件。“
的routes/api.php
中的我的API端点
的
7条答案
按热度按时间8yparm6h1#
添加
StartSession
到app/Http/Kernel.php:字符串
对我很有效
7xzttuei2#
对于未来的你,解决问题的正确方法是:
1.发布Sanctum配置
第一个月
1.通知您的应用/API中间件在正确的路由组(API,web,e.t.c)下的
app/Http/Kernel.php
上添加EnsureFrontendRequestsAreStateful
类,以利用有状态会话字符串
以下两个步骤非常重要
1.添加允许使用Sanctum SPA会话的前端域/IP地址。这可以通过在
.env
文件中添加SANCTUM_STATEFUL_DOMAINS
密钥或在config/sanctum.php
文件中修改stateful密钥的值来完成。1.对于每一个发送到受sanctum中间件保护的端点的请求,它必须包含
origin
或referer
头。如果适用,还必须包含X-XSRF-TOKEN
头。xurqigkl3#
字符串
StartSession.php
是一个会话管理器,它处理来自每个API请求会话。klsxnrf14#
在.env文件中检查
APP_URL={your app base url}
是否正确。anhgbhbe5#
在
app/Http/Middleware/Authenticate.php
中添加了if (!$request->is('api/*') && $request->session()->all())
由于验证中间件检查会话,请求崩溃,因此这有助于. P.S此修复sanctum使用.jyztefdp6#
对于Laravel 10.X在SPA配置的情况下,设法解决了这个问题,根据文档https://laravel.com/docs/10.x/sanctum#spa-configurationwithout在
app/Http/Kernel.php
的'api'
中间件组中添加\Illuminate\Session\Middleware\StartSession::class
,正如一些评论中所建议的那样。让它对我起作用的是从前端指定一个origin request header,它与
'stateful'
config中定义的任何app/config/sanctum.php
有状态域完全匹配:字符串
origin header不匹配将导致帖子中的错误。确保请求origin(或referer)header与.env文件中的
SANCTUM_STATEFUL_DOMAINS
或API_URL
匹配,正如这里的一些评论者所建议的那样。如果您在头中包含端口,请确保将其添加到SANCTUM_STATEFUL_DOMAINS
或API_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
scyqe7ek7#
身份验证路由必须在
routes/web.php
文件中。