laravel spa 的身份验证问题,它不会总是登录并且广告不正确的 cookie

时间:2021-07-14 17:29:38

标签: laravel vue.js laravel-sanctum

使用 Vue 和 Sanctum 开发 laravel 8 SPA。作为 laravel 的新手,我遇到了一个问题。

我猜问题出在 Laravel 会话 cookie 上,因为 sanctum 似乎还在继续工作,但我可能是错的。

我如何重现问题:

  1. 当我登录它工作时,会生成 sanctum 令牌,CXRF 工作,laravel auth 工作,当我 刷新页面它仍然保持工作。仍在管理页面上。

  2. 当我点击注销按钮时,它将删除所有 auth cookie 和 vuex 值,然后我被重定向到登录页面。这个看起来不错

  3. 我想重新登录,但此时它会抛出一个 POST http://localhost:3000/auth/login 419 (unknown status)

    3a。为了防止出现这种情况,我先刷新页面,然后点击登录按钮,然后返回管理页面。

  4. 当我执行前 3 个步骤时,身份验证可能会停止工作,刷新页面时我将被重定向到登录页面。

我所看到的是,当一切正常时,我有 4 个 cookie。

  1. appname_session(这是会话?)
  2. CXRF_token
  3. io(不确定这是做什么的)
  4. 随机值

但我已经看到它会添加一个带有会话值的第 5 个(有时甚至更多)cookie,这将导致注销和无效会话(laravel 端)

我有 4 条路线,(目前没有使用 web 和 api)

如果我需要在这里发布任何文件,请告诉我,因为我不知道我需要在这里发布什么

config/auth.php

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
       // 'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],

    'admin' => [
       // 'driver' => 'token',
        'provider' => 'users',
    ],
    
    'auth' => [
        'driver' => 'session',
        'provider' => 'users',
        'hash' => false,
    ],
],

routes/auth.php

Route::group(['middleware' => 'auth:sanctum'], function () {    
    Route::post('logout', [LoginController::class, 'logout']);
});

loginController.php

class LoginController extends Controller
{
    use AuthenticatesUsers;

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    protected function validator(array $data)
    {
        //validation rules
    }

    public function login(Request $request)
    {
        if ($this->validator($request->all())->fails()) {
            $errors = $this->validator($request->all())->errors()->getMessages();            
            $clientErrors = [];

            foreach ($errors as $key => $value) {
                $clientErrors[$key] = $value[0];
            }

            return $this->sendError( 'Validation error', $clientErrors, 201);
        } else {

            $credentials = [
                'email' => $request->email,
                'password' => $request->password,
            ];

            if (auth()->attempt($credentials)) {

                $user = User::where('email', $request->email)->first();

                $token = $user->createToken('auth_token')->plainTextToken;
               
                $response = [
                        // data
                ];

                return $this->sendResponse( 'Login successfully', $response, 200);
            } else {
                $msg = 'Invalid login';   
                $clientErrors = [
                    // errors
                ];                  
            }

            return $this->sendError( $msg, $clientErrors, 201);     
        }
    }

    public function logout(Request $request)
    {
        if (!empty($request->user())) {
            AuthController::removeToken($request);
            $request->session()->invalidate();
            $request->session()->regenerateToken();
           // Session::flush();
        }
    }
}

0 个答案:

没有答案