Installation
composer require atlance/jwt-core
Add the service provider to config/app.php:
'providers' => [
// ...
Atlance\JwtCore\JwtCoreServiceProvider::class,
],
Publish Config
php artisan vendor:publish --provider="Atlance\JwtCore\JwtCoreServiceProvider"
Configure .env and config/jwt.php with:
secret_key (e.g., base64:your-secret-key)algorithm (e.g., HS256)issuer (e.g., your-app-name)audience (optional, e.g., your-app-client)First Use Case: Generate a Token
use Atlance\JwtCore\Facades\Jwt;
$token = Jwt::generate([
'user_id' => 1,
'role' => 'admin',
]);
Verify the token:
$payload = Jwt::verify($token);
Authentication Middleware
Use Jwt::verify() in middleware to validate tokens:
public function handle($request, Closure $next) {
try {
$payload = Jwt::verify($request->bearerToken());
auth()->setUser($payload['user_id']);
return $next($request);
} catch (\Exception $e) {
return response()->json(['error' => 'Unauthorized'], 401);
}
}
Token Refresh
Store a refresh_token in the DB and issue a new JWT on refresh:
$newToken = Jwt::generate([
'user_id' => 1,
'exp' => now()->addHours(1), // Short-lived access token
]);
Custom Claims Extend payloads with metadata:
$token = Jwt::generate([
'user_id' => 1,
'metadata' => [
'preferences' => ['theme' => 'dark'],
],
]);
auth:api middleware.\Log::info('JWT Generated', ['token' => $token, 'payload' => $payload]);
Secret Key Management
.env and restrict file permissions.config/jwt.php updates).Algorithm Mismatch
algorithm in config/jwt.php matches the key type (e.g., HS256 for HMAC).Clock Skew
Payload Size Limits
Jwt::setDebug(true); // Logs payloads/errors
Custom Claims Validation
Override Jwt::verify() logic:
Jwt::verify($token, function ($payload) {
if ($payload['role'] !== 'admin') {
throw new \Exception('Insufficient permissions');
}
});
Token Storage
Store tokens in sessions or database for revocation:
// Revoke token
Jwt::blacklist($token);
Event Listeners Trigger events on token generation/verification:
Jwt::onGenerated(function ($token, $payload) {
event(new TokenGenerated($payload));
});
How can I help you explore Laravel packages today?