localStorage

Notre mécanisme d'authentification est fonctionnel, mais non persistant. Si l’on rafraichit la page, toutes nos données sont réinitialisées. Nous allons utiliser la Web Storage API offert par les navigateurs pour sauvegarder nos informations.

Deux mécanismes sont offerts par les navigateurs au travers de la Web Storage API :

  • sessionStorage maintient une zone de stockage distinct pour chaque origine donnée qui est disponible pour la durée de la session de la page (tant que le navigateur est ouvert, y compris les rechargements et restaure)

  • localStorage fait la même chose, mais persiste même lorsque le navigateur est fermé et rouvert.

Nous utiliserons le localStorage dans notre application afin de garder les utilisateurs connectés et leurs données même après la fermeture du navigateur, ou de la web app.

Pour nous faciliter la tâche importer le Plugin Quasar Local/Session Storage :

Importer le plugin Quasar LocalStorage

Les plugins ne sont pas automatiquement ajoutés au projet, il faut donc manuellement l'importer depuis le fichier quasar.config.js.

Ajouter 'LocalStorage' au tableau plugins :

Enregistrer user et token dans localStorage

Lorsqu'un utilisateur s'authentifie avec succès, nous sauvegarderons l'état du magasin Auth user et token dans le LocalStorage du navigateur.

En premier, importer le plugin LocalStorage dans le magasin Auth. Nous y avions déjà importé le plugin Loading, il suffit donc d'ajouter LocalStorage juste après :

Ensuite, modifier l'action setUser pour qu'elle sauvegarde les données du magasin Auth dans le localStorage du navigateur.

  • 6 : Sauvegarde le state.user dans le localStorage avec la clé 'user'

  • 7 : Sauvegarde le state.token dans le localStorage avec la clé 'token'

LocalStorage dans l’inspecteur

Maintenant nous pouvons vérifier si les données ont bien été sauvegardées dans le localStorage en utilisant l'inspecteur.

Charger les données du localStorage

Si l’on rafraichit la page, on constate que les données du localStorage sont toujours présentes, mais que nous ne sommes plus connectés dans notre application.

On peut le constater en inspectant le magasin de notre application.

Magasin Auth vide après le rafraichissement

Pour pallier à ce problème, il faut inspecter le localStorage au démarrage de l'application et s'il contient des données, alors les récupérer pour les injecter dans le magasin Auth.

Nous allons réaliser cette opération après que l'application soit montée, mounted. Pour ce faire, nous allons modifier le composant principal de notre application : src/App.vue.

Ajouter le contenu suivant à src/App.vue :

  • 6 : importation du crochet useAuthStore pour utiliser notre magasin d'authentification

  • 7 : importation du crochet onMounted pour executer du code au chargement de l'application

  • 8 : importation du plugin LocalStorage pour importer les variables du stockage local

  • 10 : Mise en place du magasin authStore

  • 13 et 14 : Récupération des des données user et token du localStorage

    • La méthode .getItem(key) retourne la valeur stockée dans le localStorage avec la clé, key, passée en paramètre ou null.

  • 16-19 : Si un user et un token existent

    • 17 & 18 : on affecte les valeurs récupérées au magasin.

On peut maintenant se connecter puis rafraichir la page et constater que les données sont remontées dans le magasin Auth.

Déconnexion

On reste connecté, c'est cool, mais il faudrait bien pouvoir se déconnecter maintenant.

On va créer une action deconnecterUtilisateur dans le magasin Auth qui va :

  • Déconnecter l'utilisateur de l'API

  • Vider les ref user et token du magasin

  • Supprimer toutes les données du localStorage : LocalStorage.clear()

  • Rediriger l'utilisateur vers le formulaire de connexion.

Déconnecter de l'API

Pour se déconnecter de l'API il faut utiliser la route POST /logout décrite ci-après.

Lorsqu'on fait appel à cette route, il faut y passer le token de l'utilisateur dans l'entête de la requête.

Le token permettra d'identifier l'utilisateur à déconnecter, et révoquera le token actuel qui sera inutilisable.

API : Se déconnecter

POST /logout

Headers

Name
Type
Description

Authorization

string

Token de type Bearer Authorization: Bearer 1Fa...3'

Axios ajouter un Token de type Bearer

Voici comment faire pour ajouter un token de type bearer dans l'entête d'une requête avec axios.

triangle-exclamation
Not found

Action deconnecterUtilisateur

Nous pouvons maintenant créer notre nouvelle action deconnecterUtilisateur dans le magasin Auth.

  • 1 : Récupération en paramètre de :

    • commit pour appeler le mutations

    • state pour récupérer la valeur du token

  • 2 : Affiche le barre de chargement, le spinner

  • 3 : Récupère l'objet Vue this et le stocke dans la variable that afin de pouvoir y accéder à l'intérieur de la fonction anonyme créée en paramètre de that().

  • 5-7 : config Axios

    • 6 : Création de l'entête avec token, en récupérant le token du magasin state.token

  • 9: Envoi de la requête POST /logout sans données mais avec le token en entête.

  • 10-15 : En cas d'erreur affiche un message

  • 16-26 : Dans tous les cas finally

    • 18-19 : Mets à null les données du magasin user et token en utilisant les mutations.

    • 21 : Supprimer le localStorage

    • 23 : Redirige l'utilisateur

    • 25 : Dans tous les cas, cache barre de chargement, le spinner.

Bouton de déconnexion

Pour exécuter l'action deconnecterUtilisateur nous allons remplacer le bouton "Se connecter" par un bouton "Se déconnecter" lorsqu'un utilisateur est connecté.

Pour savoir si l'utilisateur est connecté nous allons tester si l'état, state, user du magasin Auth contient une valeur.

Nous allons faire ce test dans le composant src/layout/MainLayout.vue.

Pour que MainLayout.vue puisse accéder à l’état, state, user du magasin Auth, nous allons devoir l'initialiser dans le setup de MainLayout.vue.

Ensuite, il faut utiliser computed pour calculer la donnée user, en l'occurence pour vérifier si elle vaut null.

On peut maintenant créer notre bouton de déconnexion et gérer l'affichage des boutons "se connecter" et "se déconnecter".

  • 2 : Affiche le bouton "Se connecter" si PAS de user

  • 10 : v-else, à l'inverse affiche le bouton "Se déconnecter" si user existe

  • 12 : Au clic fait appel à l'action deconnecterUtilisateur du magasin Auth.

Résultat

Mis à jour

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