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:
@@ -8,7 +8,7 @@ use Illuminate\Http\JsonResponse;
|
|||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Illuminate\Validation\Rules\Password;
|
use Illuminate\Validation\Rules\Password;
|
||||||
use Laravel\Sanctum\PersonalAccessToken;
|
use Laravel\Sanctum\TransientToken;
|
||||||
|
|
||||||
class AuthController extends Controller
|
class AuthController extends Controller
|
||||||
{
|
{
|
||||||
@@ -46,9 +46,15 @@ class AuthController extends Controller
|
|||||||
|
|
||||||
public function logout(Request $request): JsonResponse
|
public function logout(Request $request): JsonResponse
|
||||||
{
|
{
|
||||||
/** @var PersonalAccessToken $token */
|
|
||||||
$token = $request->user()->currentAccessToken();
|
$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.']);
|
return response()->json(['message' => 'Logged out.']);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user