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.