使用 Vue 和 Sanctum 开发 laravel 8 SPA。作为 laravel 的新手,我遇到了一个问题。
我猜问题出在 Laravel 会话 cookie 上,因为 sanctum 似乎还在继续工作,但我可能是错的。
我如何重现问题:
当我登录它工作时,会生成 sanctum 令牌,CXRF 工作,laravel auth 工作,当我 刷新页面它仍然保持工作。仍在管理页面上。
当我点击注销按钮时,它将删除所有 auth cookie 和 vuex 值,然后我被重定向到登录页面。这个看起来不错
我想重新登录,但此时它会抛出一个 POST http://localhost:3000/auth/login 419 (unknown status)
3a。为了防止出现这种情况,我先刷新页面,然后点击登录按钮,然后返回管理页面。
当我执行前 3 个步骤时,身份验证可能会停止工作,刷新页面时我将被重定向到登录页面。
我所看到的是,当一切正常时,我有 4 个 cookie。
但我已经看到它会添加一个带有会话值的第 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();
}
}
}