LexikJWTAuthenticationBundle es un paquete para Symfony que nos ofrece autenticación basada en JSON Web Token (JWT). Los tokens JWT permiten la transferencia segura de información, y se utilizan comúnmente en la autenticación de aplicaciones web y servicios. Estos tokens se presentan como un objeto JSON.
Para poder usar LexikJWTAuthenticationBundle, necesitamos instalar este paquete y configurarlo en nuestro proyecto Symfony:
1. Añadir el paquete a nuestro archivo composer.json
composer require lexik/jwt-authentication-bundle
2. Registrar el paquete
Registrar el paquete en nuestro 'config/bundles.php', aunque si disponemos de Flex no sería necesario:
return [
//...
Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true],
];
3. Generar las claves SSL
Generamos las claves SSL necesarias para JWT:
php bin/console lexik:jwt:generate-keypair
Las claves se almacenarán en 'config/jwt/private.pem' y /config/jwt/public.pem de manera predeterminada.
4. Configuración
Para configurar las claves SSL y la frase de contraseña debemos dirigirnos a nuestro archivo '.env' y añadir lo siguiente:
JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem
JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
JWT_PASSPHRASE=testdephassphrase
A continuación,, debemos establecer estas variables de entorno en el archivo 'config/packages/lexik_jwt_authentication.yaml':
lexik_jwt_authentication:
secret_key: '%env(resolve:JWT_SECRET_KEY)%'
public_key: '%env(resolve:JWT_PUBLIC_KEY)%'
pass_phrase: '%env(JWT_PASSPHRASE)%'
token_ttl: 3600 # en segundos, el valor predeterminado es 3600
5. Configuración de Seguridad de la Aplicación
Para Symfony 5.3 y versiones posteriores debemos añadir lo siguiente a nuestro archivo de security en 'config/packages/security.yaml' :
security:
enable_authenticator_manager: true
# ...
firewalls:
login:
pattern: ^/api/login
stateless: true
json_login:
check_path: /api/login_check
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
api:
pattern: ^/api
stateless: true
jwt: ~
access_control:
- { path: ^/api/login, roles: PUBLIC_ACCESS }
- { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
Para versiones anteriores revisar la documentación oficial en: Symfony
6. Configuración de Rutas de la Aplicación
# config/routes.yaml
api_login_check:
path: /api/login_check
7. Obteniendo y usando el Token
Para obtener el token vamos a usar cURL:
curl -X POST -H "Content-Type: application/json" https://localhost/api/login_check -d '{"username":"test","password":"test"}'
Si la solicitud es correcta, nos devolverá algo parecido a esto:
{
"token" : "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJleHAiOjE0MzQ3Mjc1MzYsInVzZXJuYW1lIjoia29ybGVvbiIsImlhdCI6IjE0MzQ2NDExMzYifQ.nh0L_wuJy6ZKIQWh6OrW5hdLkviTs1_bau2GqYdDCB0Yqy_RplkFghsuqMpsFls8zKEErdX5TYCOR7muX0aQvQxGQ4mpBkvMDhJ4-pE4ct2obeMTr_s4X8nC00rBYPofrOONUOR4utbzvbd4d2xT_tj4TdR_0tsr91Y7VskCRFnoXAnNT-qQb7ci7HIBTbutb9zVStOFejrb4aLbr7Fl4byeIEYgp2Gd7gY"
}
Para hacer uso de este token será necesario pasarlo en cada solicitud que hagamos, ya sea como encabezado de autorización o como un parámetro de la consulta. Por defecto solo está activada la autenticación mediante cabeceras: Authorization: Bearer {token}
Fuentes: Symfony.com