使用 sanctum 的 SPA 身份验证失败,并显示以下错误消息:“未经身份验证”。

时间:2021-03-19 14:37:04

标签: laravel vue.js axios single-page-application laravel-sanctum

我正在使用 Vuejs 和 Laravel 构建 SPA,我安装了 Laravel sanctum 以通过其令牌对用户进行身份验证。

api.php

Route::post('/teacher/login', 'Teacher\RegisterController@login')->middleware('auth:sanctum');

登录.Vue

login(){
            axios.get('/sanctum/csrf-cookie').then(response => {
                this.form.post('api/teacher/login')
                .then( response => {
                    console.log( response );
                })
                .catch( error => {
                    console.log( error );
                })
            });
        }

自定义控制器

public function login(Request $request){

$credentials = $request->only('email', 'password');

        if(Auth::attempt($credentials)){
            return response()->json(Auth::user(), 200);
        }
}

我在没有 sanctum 中间件的情况下检查了它,它成功地记录了用户,但是我在路由中添加了中间件,它说您的请求未经身份验证。 我按照官方的 Laravel-7 文档实现了所有内容,我不明白为什么它说未经身份验证,附上 IMG 以了解更多细节。

enter image description here enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

确保您从 csrf-cookie 获得的 X-CSRF-TOKEN 或 X-XSRF-TOKEN 附加到 api/teacher/login 的 HTTP 请求标头。对于 Axios,你可以用

设置
axios.defaults.headers.common['X-XSRF-TOKEN'] = <the x-xsrf-token from csrf-cookie request>

确保使用端口号在 SANCTUM_STATEFUL_DOMAINS 中声明 .env。 您也可以包含多个域。 SANCTUM_STATEFUL_DOMAINS='your-domain.test:8080,localhost:8000'

如果没有这个,您将遇到 Session store not set 问题,因为中间件 EnsureFrontendRequestsAreStateful 正在检查请求是否来自前端。如果是来自fronetned,那么它会附加以下中间件

  • 加密Cookies
  • 开始会话
  • VerifyCsrfToken