The logout button doesn't work, it returns “Method Illuminate\Auth\RequestGuard::logout does not exist.” I checked everything seems to be correct, but it doesn't work.
route:
Route::middleware(["auth:sanctum"])->group(function(){
Route::post("/logout", [UserController::class, "logout"])->name("logout");
});
userController:
public function logout(Request $request)
{
$request->user()->tokens()->delete();
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect("/");
}
Vue code:
<v-btn color="white" class="primary--text" type="submit" @click="logout" elevation="1">
<v-icon left>mdi-logout</v-icon>
Logout
</v-btn>
logout() {
this.isLoading = true;
router.post('/logout', {}, {
onFinish: () => {
this.isLoading = false;
},
onSuccess: () => {
router.visit('/', {
replace: true,
preserveState: false,
only: [],
});
},
onError: (errors) => {
this.isLoading = false;
this.showSnackbar('Logout failed', 'error');
console.error('Logout Errors:', errors);
},
});
}
Method Illuminate\Auth\RequestGuard::logout does not exist.
happens because you're calling Auth::logout()
while using Sanctum with API tokens, which uses RequestGuard
, and that guard doesn't have a logout()
method.
Explanation:
Auth::logout()
only works with session-based authentication (like web guard).
You're using auth:sanctum
, which uses token-based authentication.
In Sanctum’s token-based auth, there’s no concept of “logging out” like session-based systems. Instead, you delete the token (which you're already doing with $request->user()->tokens()->delete()
).
Just remove Auth::logout() from your logout() method. Your token deletion and session invalidation are enough.
public function logout(Request $request)
{
// Delete all tokens for the user
$request->user()->tokens()->delete();
// Invalidate session (only necessary if you mix token + session auth)
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}