Usando LexikJWTAuthenticationBundle con Symfony

symfony.jpg
Solucionex
05
Ene 24

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

symfony