Ce que JSON:API NE fait PAS
JSON:API est entièrement basé sur les entités. Cela signifie qu'il ne peut pas traiter des règles métier ou effectuer des actions qui ne peuvent pas être considérées comme du « CRUD ». La logique métier, comme l'enregistrement d'un nouveau compte, la connexion d'un utilisateur ou la demande d'un nouveau mot de passe, ne fait pas partie de JSON:API. Beaucoup de ces fonctionnalités sont déjà fournies par le cœur de Drupal.
Voici une liste non exhaustive des besoins courants et des solutions associées.
Les chemins d’intérêt sont :
- /session/token
- /user/register
- /user/login
- /user/login_status
- /user/logout
Obtenir un jeton de session
Obtenir un jeton
curl \
--request GET http://drupal.d8/session/token
Un jeton est retourné en texte brut (non JSON) dans le corps de la réponse.
Utiliser les jetons
En plus du jeton de session, lorsque vous vous connectez, vous obtenez un csrf_token
et un logout_token
. Vous aurez besoin du logout_token
pour déconnecter un utilisateur du système (voir ci-dessous). Le csrf_token
ou le jeton de session est nécessaire pour les requêtes modifiables (par exemple, POST, PATCH et DELETE).
Enregistrement utilisateur
Alors que JSON:API fourni par le cœur ne supporte pas l'enregistrement de nouveaux utilisateurs, vous pouvez installer le module JSON:API User Resources pour ajouter des points d’accès JSON:API liés aux utilisateurs, incluant l’enregistrement, la réinitialisation et la mise à jour du mot de passe.
Sinon, vous pouvez utiliser le module REST du cœur. Pour permettre aux utilisateurs de s’enregistrer via REST, la ressource REST user_registration
doit être activée (voir l’exemple avec REST UI ci-dessous).
curl \
--header "Content-Type: application/json" \
--header "X-CSRF-Token: 57sTS-KS7UoYAWAPyzt0iJmo300CFct3jdKyWM-UiiQ" \
--request POST "https://drupal.d9/user/register?_format=json" \
--data '{"name": {"value": "thename123"}, "pass": {"value": "thepass"}, "mail": {"value": "someone@example.com"}}'
Utilisez la valeur du jeton de session avec l’en-tête X-CSRF-Token. Une réponse réussie devrait contenir certaines valeurs de champs utilisateur, notamment l’UUID du nouvel utilisateur créé :
{
"uuid" : [ { "value" : "3e75b757-831e-4bf7-bbb6-25b8c50c7ac0" } ]
}
Notez aussi que la réponse ne contient pas d’en-têtes « Set-Cookie », même si les visiteurs sont autorisés à créer un compte eux-mêmes. Ainsi, s’il n’y a pas d’approbation ou de confirmation requise, vous pouvez connecter un utilisateur après l’enregistrement avec les mêmes valeurs de nom et mot de passe.
Connexion utilisateur
curl \
--header "Content-type: application/json" \
-c cookie.txt \
--request POST "http://drupal.d8/user/login?_format=json" \
--data '{"name":"admin", "pass":"admin"}'
Le paramètre -c cookie.txt
indique à curl de sauvegarder un cookie. Votre réponse devrait ressembler à ceci :
{
"csrf_token" : "57sTS-KS7UoYAWAPyzt0iJmo300CFct3jdKyWM-UiiQ",
"logout_token" : "zzRaD8ZgLT1TkG804mYpVVTyM-pgoDm4h9XZ9JHSoCw",
"current_user" : {
"roles" : [
"authenticated",
"administrator"
],
"name" : "admin",
"uid" : "1"
}
}
Statut utilisateur
curl \
--header "Content-type: application/json" \
-b cookie.txt \
--request GET "http://drupal.d8/user/login_status?_format=json"
Le paramètre -b cookie.txt
indique à curl d’envoyer (et non de sauvegarder) le cookie de la requête précédente. Si vous êtes connecté, cela retournera 1
dans le corps de la réponse en texte brut (non JSON), sinon 0
.
Déconnexion utilisateur
curl \
--header "Content-type: application/json" \
-b cookie.txt \
--request POST "http://drupal.d8/user/logout?_format=json&token=zzRaD8ZgLT1TkG804mYpVVTyM-pgoDm4h9XZ9JHSoCw"
Cela déconnectera l’utilisateur authentifié via cookie.txt
. Utilisez la valeur logout_token
avec le paramètre de requête token
.
Mécanismes d’authentification
L’exemple ci-dessus est un parmi de nombreux mécanismes d’authentification disponibles. Vous devez explorer celui qui convient le mieux à vos besoins.
Un module OAuth Drupal est disponible sous le nom simple_oauth.
Références
Consultez ces notes de modifications pour plus d’informations :
- https://www.drupal.org/node/2720655 (login, login_status et logout)
- https://www.drupal.org/node/2752071 (inscription)
Pour l’authentification, vous pouvez également envisager d’utiliser d’autres protocoles d’authentification.
Si vous décidez d’utiliser une authentification « cookie » avec votre application JavaScript côté frontend et Drupal côté backend, le navigateur gère tout le stockage des cookies pour vous. N’oubliez pas que si votre application JS et votre site Drupal ont des noms de domaine différents, vous devez autoriser le navigateur à stocker les cookies de session utilisateur en modifiant le paramètre SameSite du cookie à « None ». Pour cela, éditez votre fichier services.yml
et ajoutez le paramètre suivant :
parameters:
session.storage.options:
cookie_samesite: None
REST UI
Le module contrib REST UI permet de configurer les ressources du module REST du cœur. Voici comment activer l’inscription utilisateur avec ce module.
- Après avoir installé et activé le module REST UI, rendez-vous sur la page de configuration
/admin/config/services/rest
et activez la ressource « Inscription utilisateur ». Éditez cette ressource, activez la méthode POST, le format JSON, et le fournisseur Cookie par exemple. Le réglage par méthode permet aussi de séparer formats et fournisseurs par type de requête. - Ensuite, accordez au rôle utilisateur anonyme la permission « Accès POST sur la ressource Inscription utilisateur » dans
/admin/people/permissions/module/rest
. - Enfin, assurez-vous que les visiteurs peuvent créer un compte via
/admin/config/people/accounts
.
Article extrait de la Documentation Drupal.