How to catch expired token json exception in Laravel Sanctum with middleware.
https://laravel.com/docs/12.x/sanctum#api-token-authentication
<?php
namespace App\Http\Middleware\Api;
use Closure;
use Illuminate\Http\Request;
use Laravel\Sanctum\PersonalAccessToken;
/**
* Sanctum expired token middleware.
*
* Add middleware in bootstrap/app.php
* $middleware->api(prepend: [ \App\Http\Middleware\Api\ExpiredToken::class ]);
*/
class ExpiredToken
{
public function handle(Request $request, Closure $next)
{
$bearer = $request->bearerToken();
if ($bearer) {
$token = PersonalAccessToken::findToken($bearer);
if ($token instanceof PersonalAccessToken) {
if($token->expires_at && $token->expires_at->isPast()) {
$request->merge([
'token_expired' => $token->expires_at && $token->expires_at->isPast(),
'token_details' => $token
]);
return response()->json([
'message' => 'Expired Token.',
'token_expired' => $token->expires_at && $token->expires_at->isPast(),
'token_details' => $token
], 403);
}
}
}
return $next($request);
}
}
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware): void {
// Sanctun SPA
$middleware->statefulApi();
// Sanctum API
$middleware->api(prepend: [
\App\Http\Middleware\Api\ExpiredToken::class
]);
})
php artisan config:publish cors
# Change config/cors.php
'supports_credentials' => true,
<?php
// Login and get token
Route::post('/login-api', function () {
// Validate user here ...
$user = User::first();
// Create api bearer token
// Use this token with Authorization: Bearer token from RapidApi Client
return $user->createToken('user-token-mobile', ['*'], now()->addYear())->plainTextToken;
});
<?php
if(auth()->guard('web')->check() && request()->hasSession()) {
//
}
- Do testowania REST API używać RapidApi Client w vscode.
- Nie używać multiple guards z sanctum (to bez sensu), dodaj lepiej spatie permissions z rolami lub użyj alilities z sanctum.
- W SPA $request->user()->currentAccessToken()->token nie działa (tylko z bearer tokens).
- Pobieranie usera w sanctum auth('sanctum')->user() lub z $request->user().