Découvrez les nouvelles fonctionnalités d’Ibexa DXP v3.2 : l’Authentification JWT

Découvrez les nouvelles fonctionnalités d’Ibexa DXP v3.2 : l’Authentification JWT

Les capacités headless bien développées sont l’une des grosses forces de la DXP d'Ibexa. L'API REST et GraphQL, disponibles dès maintenant, sont des API robustes, rapides et fiables, permettant d’utiliser toutes les capacités du produit. Ces API sont largement utilisées par les développeurs pour créer d'élégantes applications web frontales JavaScript monopages, pour connecter des applications mobiles autonomes ou servir dans de nombreux autres cas.

Le marché de la technologie évolue rapidement, notamment en ce qui concerne l'authentification, l'autorisation, ou d'une manière plus générale, la communication entre les différents services.

En raison de sa nature, l'authentification a toujours été quelque chose de délicat. Le large éventail de solutions disponibles ne facilite pas les choses, car il ne serait pas possible de les suivre, de les mettre en œuvre et de toutes les mettre à disposition dans la DXP d’Ibexa.

Nous sommes donc fiers de poursuivre notre évolution en introduisant une nouvelle méthode d'authentification à nos API headless publiques. Jusqu'à présent, il était uniquement possible d'y accéder via l'authentification basée sur la session ou l'authentification de base HTTP. Avec la v3.2 (bientôt disponible), nous introduisons une nouvelle méthode d'authentification moderne : JSON Web Token (JWT). JWT est une technologie sûre, rapide et simple qui existe depuis un certain temps et qui est largement utilisée dans le monde du développement web moderne.

Le Jeton Web JSON - JWT

JWT est un mécanisme utilisé dans le cadre des API web mais aussi plus largement dans les termes généraux des applications web et mobiles. Au lieu d'utiliser un cookie de session traditionnel ou des en-têtes d'authentification basés sur HTTP, dans cette méthode, un jeton unique est généré et doit être utilisé pour chaque demande nécessitant une vérification d'autorisation. Ce type de jeton a une certaine durée de vie (TTL en anglais, pour Time To Live) après quoi il ne sera plus utilisable et un nouveau jeton devra être généré.

Les informations d'identification doivent être envoyées à l'application une seule fois lors de la demande d'un nouveau jeton. Une fois généré, le jeton à lui seul suffit pour s'authentifier avec succès dans le système.

Pour plus d'informations, veuillez consulter JWT.io.

Configuration dans la DXP Ibexa

Dans la version 3.2 du DXP d'Ibexa, l'authentification JWT est une fonctionnalité optionnelle, qui doit donc être activée pour être utilisée.

Puisque cette méthode était auparavant utilisée pour l'authentification dans le Page Builder, elle est déjà installée et certaines configurations devraient déjà être disponibles dans le système. Une configuration de base peut être trouvée dans le fichier config/packages/lexik_jwt_authentication.yaml Contrairement aux besoins du Page Builder, la prise en charge complète de JWT nécessite l'activation de l'option authorization_header

L'ensemble de la configuration peut ressembler à ceci :

lexik_jwt_authentication:
    secret_key: '%env(APP_SECRET)%'
    encoder:
        signature_algorithm: HS256
    # Disabled by default, because Page builder uses a custom extractor
    token_extractors:
        authorization_header:
            enabled: true
        cookie:
            enabled: false
        query_parameter:
            enabled: false

De plus, un nouveau pare-feu Symfony sera également requis. Il devrait être défini avant ezpublish_front dans le fichier config/packages/security.yaml.

Pour l'API REST, il faudra configurer le pare-feu suivant :

ezplatform_rest:
    request_matcher: EzSystems\EzPlatformAdminUi\REST\Security\NonAdminRESTRequestMatcher
    user_checker: eZ\Publish\Core\MVC\Symfony\Security\UserChecker
    anonymous: ~
    guard:
        authenticators:
            - lexik_jwt_authentication.jwt_token_authenticator
        entry_point: lexik_jwt_authentication.jwt_token_authenticator
    stateless: true

Pour GraphQL c’est presque pareil :

ezplatform_graphql:
    request_matcher: EzSystems\EzPlatformGraphQL\Security\NonAdminGraphQLRequestMatcher
    user_checker: eZ\Publish\Core\MVC\Symfony\Security\UserChecker
    anonymous: ~
    guard:
        authenticators:
            - lexik_jwt_authentication.jwt_token_authenticator
        entry_point: lexik_jwt_authentication.jwt_token_authenticator
    stateless: true

Dans la dernière version, ces pare-feu sont déjà inclus et commentés dans le fichier de configuration par défaut.

Usage

Cette nouvelle fonctionnalité ajoute un nouveau point de terminaison de l’API REST et une mutation GraphQL qui peuvent être appelées pour obtenir un jeton.

MéthodeLIGNE
Endpoint/api/ezp/v2/user/token/jwt

Accept header
Content-Type header

application/vnd.ez.api.JWT+json
application/vnd.ez.api.JWTInput+json

Exemple de requête en corps de texte :

{
    "JWTInput": {
        "username": "admin",
        "password": "publish"
    }
}

Voici la réponse attendue si les informations d'identification fournies sont valides:

{
    "JWT": { 
        "_media-type": "application/vnd.ez.api.JWTToken+json",
        "_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MDAxNjEyMzgsImV4cCI6MTYwMDE2NDgzOCwicm9sZXMiOlsiUk9MRV9VU0VSIl0sInVzZXJuYW1lIjoiYWRtaW4ifQ.AXfviM-usgDWSpYuRbNp294d2s2nNi720xhPyu6V3Ro"
    }
}

Il faudra ensuite définir le jeton comme une valeur pour la méthode d'authentification Bearer-Token dans l'application cliente.

Résumé

Cette nouvelle méthode d’authentification pratique permet à la DXP d’Ibexa de fournir une expérience développeur améliorée en rendant le travail en Headless plus rapide, plus fluide et sans friction. Restez à l’écoute pour découvrir les futures améliorations de l'expérience développeurs dans la prochaine version !

Insights and news