Magasin Auth

Création du magasin Auth

Nous allons créer un magasin qui enregistrera les données de l'utilisateur authentifié (nom, token) et qui lui permettra de se connecter, se déconnecter ou créer un nouveau compte.

Créer un nouveau magasin src/stores/store-auth.js et y copier ce code.

store/store-auth.js
import { defineStore } from 'pinia'

export const useAuthStore = defineStore('authStore', () => {
  return {}
})

Enregistrer un nouvel utilisateur

Commençons par créer une action enregistrerUtilisateur(utilisateur) qui sera appelée par FormSignup.vue. Cette action recevra en paramètre, utilisateur, les données du formulaire d'enregistrement.

store-auth.js
/**
 * @param {{email: string, name: string, password: string, password_confirmation: string}} utilisateur
 */
const enregistrerUtilisateur = (utilisateur) => {
  console.log('enregistrerUtilisateur', utilisateur)
}

return { enregistrerUtilisateur }
circle-info

Le commentaire JavaDoc permet de définir un type sur le paramètre! Ainsi, on se souvient plus facilement quelles sont les données passées.

Appel de l'action

Avant d'aller plus loin, nous allons mapper l'action dans FormSignup.vue et l'appeler en y passant les données pour nous assurer que tout fonctionne.

  • 3 : importation du crochet du store useAuthStore

  • 12 : initialisation du store authStore

  • 15 : appel de l'action enregistrerUtilisateur avec les données du formulaire en paramètre.

Si tout est OK, les données du formulaire s'affichent dans la console.

Envoi d'une requête POST à l'API

Pour créer un nouvel utilisateur avec l'API il faudra utiliser la route ci-après et y passer les paramètres demandés.

Créer un utilisateur

POST /register

Permet la création d'un nouvel utilisateur pour l'API ToDo

Request Body

Name
Type
Description

name

string

email

string

password

string

password_confirmation

string

Axios

Pour dialoguer avec l'API, nous utiliserons la librairie JavaScript axios :

Not found

Axios a été initialisé par Quasar et ajouté à notre projet dans src/boot/axios.js

Si Axios et son boot n'existent pas vous pouvez le faire avec les commandes suivantes ;

Modifier le contenu de ce fichier avec le code suivant qui préfixera automatiquement les routes de l'API avec l'URI de base de notre API https://todo.kode.ch/api.

Pour y accéder depuis des fichiers JavaScript sans instance Vue, comme nos magasins, il faudra l'importer :

Requête POST avec Axios

Créons une requête POST avec axios dans notre action enregistrerUtilisateur et affichons son résultat en cas de réussite .then ou en cas d'échec .catch dans la console.

triangle-exclamation
  • 1 : importation d'axios

  • 22 : envoi d'un requête POST /register avec les données du formulaire en paramètre payload.

  • 23-25 : en cas de succès, affiche la réponse de l'API (objet JS).

  • 26-28 : en cas d'échec affiche la réponse de l'API (objet JS), stockée dans l'erreur JavaScript.

    • pour accéder à la réponse d'une erreur : error.response.

Réponse en cas de succès

Exemple de réponse en cas de succès

Réponse en cas d'erreur

Exemple de réponse en cas d'échec

Sauvegarder l'utilisateur dans le magasin

Que faire avec la réponse de l'API ? Et bien, on va récupérer les données de l'utilisateur et les sauvegarder dans notre magasin.

On pourra ainsi savoir si un utilisateur est connecté ou non et utiliser le token (clé de sécurité identifiante) pour appeler les routes protégées, notamment celles qui nous retourneront les tâches de l'utilisateur.

Pour ce faire nous allons :

  1. Créer un ref user et token initialisés à null dans le magasin store-auth.js

  2. Modifier l'action enregistrerUtilisateur , en cas de succès de la requête de création

    1. Affecter le token et l'objet user au states

    2. Rediriger l'utilisateur vers la page d’accueil

Résultat :

  • 7 : Création de la ref user

  • 8 : Création de la ref token

  • 24-25 : modification de user et token

  • 26 : Redirige l'utilisateur vers la page d'accueil

Connexion d'un utilisateur

Connecter un utilisateur

POST /login

Request Body

Name
Type
Description

email*

string

password*

string

Mêmes opérations que pour la création d'un compte :

  1. Création d'une action connecterUtilisateur

    1. Envoyer la requête POST /login avec axios et y passer les données de connexion

    2. Récupérer les données et modifier les ref user et token

    3. Redirige l'utilisateur vers la page d'accueil

  2. Modifier le formulaire de connexion dans ConnexionForm.vue

    1. appeler connecterUtilisateur et y passer les données du formulaire

Résultat

  • store-auth.js

    • 32-44 : Création de l'action connecterUtilisateur

  • FormLogin.vue

    • 31 : Importation de mapActions

    • 43 : Mappage de connecterUtilisateur

    • 45 : Appelle connecterUtilisateur et y passer les données du formulaire

Amélioration du code, refactoring

Le code des méthodes enregistrerUtilisateur et connecterUtilisateur se ressemble beaucoup. Afin d'améliorer notre code, nous allons créer une nouvelle méthode setUser, qui regroupe le code identique de nos deux méthodes.

L'action setUser va sauvegarder les données de l'utilisateur dans le magasin Auth et rediriger l'utilisateur vers la page des tâches.

Pour appeler une action depuis une autre action, il suffit de l'appeler. Vu que le code est interne à notre magasin, il ne faut pas le retourner dans notre setup!

Gestion des erreurs

Si l'utilisateur entre un mauvais login ou mot de passe, rien ne s'affiche.

Nous allons créer une fonction qui s'occupera d'afficher les message d'erreurs pour toute notre application. Pour que cette fonction soit utilisable par l'ensemble de l'application, nous allons la créer dans un fichier séparer qui sera importer par les fichiers qui en ont besoin.

Pour afficher les messages d'erreurs, nous utiliserons le plugin Dialog de Quasar :

Créer un le fichier src/fonctions/message-erreur.js et y copier le code suivant.

Il faut maintenant importer cette fonction dans le magasin Auth et l'appeler en cas d'échec dans les actions enregistrerUtilisateur et connecterUtilisateur.

  • 2 : Importation de la fonction afficherMessageErreur

  • 34-37 et 47-50 : affiche un message d'erreur et y passe les données d'erreur retournée par l'API

  • 38 et 51 : L'instruction throw permet de lever une exception définie par l'utilisateur. L'exécution de la fonction courante sera stoppée et une erreur sera visible dans la console.

circle-info

Idée : Faire la même chose pour la validation d'une adresse e-mail en créant un fichier src/functions/valider-email.js

Loader...

Le temps de réponse de l'API varie et peut parfois prendre quelques secondes.

Afin d'indiquer à l'utilisateur qu'un traitement est en cours, nous allons afficher un loader en utilisant le plugin Loading de Quasar.

Pour utiliser ce plugin, il suffit de l'importer et d'utiliser les méthodes Loading.show() et Loading.hide() pour afficher et cacher le loader.

Importation du plugin Loader

Activer le plugin Loading en l'ajoutant dans quasar.config.js :

Il faudra afficher le loader lorsque l'utilisateur démarre les action enregistrerUtilisateur et connecterUtilisateuret les cacher après avoir reçu une réponse.

  • 6 : importation du plugin Loading

  • 27 et 45: Affiche le loader lorsqu'on se connecte ou crée un compte utilisateur

  • 33 et 51 : Cache le loader si il y a une erreur, avant d'afficher le message

  • 20 : Cache le loader après la connexion de l’utilisateur

Mis à jour

Ce contenu vous a-t-il été utile ?