【发布时间】:2020-12-14 07:12:10
【问题描述】:
我现在遵循两种不同的方法在我的 Laravel 7/Vue SPA 中使用 Laravel Sanctum 进行身份验证。两者都遇到了同样的问题。方法如下:
https://blog.codecourse.com/setting-up-laravel-sanctum-airlock-for-spa-authentication-with-vue/
https://dev.to/aschmelyun/authenticating-a-vue-spa-is-easy-with-laravel-sanctum-392a
两者都做同样的事情 - 安装 Sanctum,安装标准身份验证脚手架,设置中间件,添加一两个虚拟用户。然后,使用 Axios 访问 sanctum/csrf-cookie 路由,然后是 /login 路由,并传入电子邮件和密码。
但是,使用这两种方法,我都会遇到相同的问题 - 401 'Unauthenticated' 错误。浏览器开发工具的 Network 选项卡显示 sanctum/csrf-cookie route 返回 204 并且设置了 Laravel 会话和 XSRF cookie。 login 路由显示 302 和到 /home 的重定向,这是标准的 Laravel auth 重定向。然后当它到达 api.php 文件中定义的路由时:
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
它返回 401 - 未经身份验证。
现在,使这项工作看起来符合预期的唯一方法是调整 RouteServiceProvider.php 中的 mapApiRoutes() 函数:
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
将中间件属性从“api”更改为“web”可以解决此问题。但这似乎是一个完整的问题,我不应该做的事情。
我已完全按照这两种方法进行操作 - 所有域、中间件等在这两种情况下的设置都完全相同。
有什么想法吗?
【问题讨论】:
-
您是否在 .env 中设置了会话域?我浏览了这两个链接,但认为我没有发现任何有关会话域的信息。此外,文档比那些链接好 100 倍。
-
@user3532758 你是什么意思? SESSION_DOMAIN 变量还是 SANCTUM_STATEFUL_DOMAINS?
-
两者都需要设置。 laravel.com/docs/7.x/sanctum#cors-and-cookies
domain这里指的是SESSION_DOMAIN -
根据文档,只有在使用子域时才需要设置 SESSION_DOMAIN。此外,我遵循的两种方法都没有提及它,从全新安装开始。
-
试试设置,值得一试,不是吗?
标签: php laravel vue.js laravel-sanctum