fix: handle TransientToken in logout for session-based auth

When the SPA authenticates via cookies (not Bearer token), Sanctum returns
a TransientToken from currentAccessToken() which has no delete() method.
Detect it and invalidate the session instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Ovidiu U
2026-04-11 13:29:03 +01:00
parent 977ae8a5a1
commit 02b004f381

View File

@@ -8,7 +8,7 @@ use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rules\Password;
use Laravel\Sanctum\PersonalAccessToken;
use Laravel\Sanctum\TransientToken;
class AuthController extends Controller
{
@@ -46,9 +46,15 @@ class AuthController extends Controller
public function logout(Request $request): JsonResponse
{
/** @var PersonalAccessToken $token */
$token = $request->user()->currentAccessToken();
$token->delete();
// TransientToken means session-based auth (no Bearer token) — invalidate session instead
if ($token instanceof TransientToken) {
$request->session()->invalidate();
$request->session()->regenerateToken();
} else {
$token->delete();
}
return response()->json(['message' => 'Logged out.']);
}