Cours - Api Platform - Chapitre 03 - Recevoir des données avec l'authentification

SOMMAIRE


Introduction


Dans le chapitre précédent, nous avons réussi à nous authentifier et à utiliser des API protégées. La communication se réalise avec un token. Nous allons voir dans ce chapitre, la méthode permettant de récupérer des données supplémentaires concernant l’utilisateur qui s’est authentifié.


A. Mise en place d’un écouteur d’événement


Symfony permet de gérer et de créer des événements, c’est-à-dire des situations qui ont lieu sur le site (une connexion, une inscription, etc.).

Les créateurs du package « LexikJWTAuthenticationBundle » fournissent un certain nombre d’événements. Par exemple, le moment où l’authentification a échoué ou au contraire a réussi. Vous pouvez jeter un œil dans la documentation suivante pour plus de détail : LexikJWTAuthenticationBundle


Afin de déterminer qu’un événement se produit, nous devons créer un écouteur(« Listener »). C’est celui qui nous prévient. Dans notre cas, après une authentification réussie, c’est le moment d’y ajouter des données supplémentaires. Ainsi, nous allons écrire le code qui s’occupe de compléter l’envoi du token en écrivant une nouvelle classe et une méthode qui fera ce travail.


Dans votre répertoire « src », créez le répertoire « EventListener », qui nous permettra d’ajouter une classe par événement que nous souhaitons écouter.

À l’intérieur de ce répertoire, créez le fichier « AuthenticationSuccessListener.php ».

src/EventListener/AuthenticationSuccessListener.php


<?php

namespace App\EventListener;
use Symfony\Component\Security\Core\User\UserInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;


class AuthenticationSuccessListener{

  /**
    * @param AuthenticationSuccessEvent $event
  */
  public function onAuthenticationSuccessResponse(AuthenticationSuccessEvent $event)
  {
    $data = $event->getData();
    $user = $event->getUser();

    if (!$user instanceof UserInterface) {
        return;
    }

    $data['data'] = array(
        'roles' => $user->getRoles(),
        'id' => $user->getId(), 
        'nom' => $user->getNom(),
        'prenom' => $user->getPrenom(),
    );

    $event->setData($data);
  }
}
        

     


Commentaires :

$data = $event->getData(); // permet de récupérer un tableau de données lié à l’événement qui a eu lieu. Nous le stockons dans la variable $data

$user = $event->getUser(); // Nous récupérons les données concernant l’utilisateur connecté.

if (!$user instanceof UserInterface) { // Nous vérifions que l’utilisateur récupéré est bien une instance de UserInterface. Dans le cas contraire, nous quittons cette méthode.

$data['data'] = array( // permet de créer une clé « data » dans le tableau « $data ».

Cette clé permet la création d’un tableau dans lequel nous stockons les rôles de l’utilisateur, son identifiant, son nom et son prénom.

$event->setData($data); // nous retournons les données complétées à l’événement.

B. Configuration du service 


Maintenant que nous avons écrit notre événement, nous devons lui dire de se lancer dans le cas où une authentification s’exécute avec succès.

Dans le fichier « config/services.yaml » :


services:
    acme_api.event.authentication_success_listener:
        class: App\EventListener\AuthenticationSuccessListener
        tags:
            - { name: kernel.event_listener, event: lexik_jwt_authentication.on_authentication_success, method: onAuthenticationSuccessResponse }


Commentaires :

acme_api.event.authentication_success_listener: // nom du service à exécuter, c’est un identifiant qui doit être unique

class: App\EventListener\AuthenticationSuccessListener // e chemin vers votre nouvelle classe

name: kernel.event_listener // nom du gestionnaire d’événements

"event »: lexik_jwt_authentication.on_authentication_success // événement du package lorsque l’authentification s’est bien déroulée.

method: onAuthenticationSuccessResponse // nom de la méthode qu’il faut exécuter


Vous pouvez vérifier que votre écouteur est bien enregistré en exécutant la ligne suivante :


php bin/console debug:event-dispatcher





C. Vérification 


Vous pouvez maintenant vérifier que l’événement fonctionne en vous rendant sur le catalogue des API. Connectez-vous en indiquant un email et un mot de passe.





Voici un exemple de réponse :



Commentaires :


Vous voyez la clé « token » comme dans le chapitre 2 et la clé « data ». Dans celle-ci, vous retrouvez les données supplémentaires souhaitées.