1
votes

Angular 8 effacement local Stockage à la déconnexion

J'utilise localStorage pour le jeton d'authentification. pour l'enregistrer, j'utilise localStorage.setItem ('token', 'value') et pour le supprimer, j'utilise localStorage.clear () et les deux fonctionnent très bien. Mais quand je me suis connecté avec un autre utilisateur, le constructeur du service est jusqu'à envoyer le jeton précédent qui est en fait supprimé de localStorage () . le constructeur du service est sous

onLogout() {
    localStorage.removeItem('eq_user');
    localStorage.clear();
    this.authService.logout().subscribe( s => {
        this.route.navigate(['login']);
   });
  }

Connexion:

login() {
  this.auth.login(data).subscribe((response: UserToken) => {
    localStorage.setItem('eq_user', JSON.stringify(response));
    this.router.navigate([this.returnUrl]);
  },
  error => {
    this.error = true;
    this.errorMsg = error.message;
  }
}

Déconnexion

  token: string;
  constructor(private http: HttpClient) {
    const user = JSON.parse(localStorage.getItem('eq_user'));
    if ( user ) {
      this.token = user.access_token;
    }
  }

ce qui suit est lien identique à mon problème.

https://stackblitz.com/

Cliquez d'abord sur setValue puis cliquez sur A à partir du composant et A à partir du service, la première fois, cela prendra le valeur correcte. Mais lorsque vous cliquez à nouveau sur setValue, puis cliquez sur les deux autres boutons, le bouton Component renvoie une nouvelle valeur mais le service ne renvoie pas les nouvelles valeurs.


5 commentaires

un nouveau jeton est envoyé lorsque la page est rechargée.


selon votre code, le service stocke le jeton à partir du stockage local dans son champ de propriété. vous devez donc effacer cette propriété de votre service.


Veuillez fournir le code dans lequel vous définissez et supprimez le jeton du stockage local?


J'ai édité la question et ajouté les fonctions de connexion et de déconnexion


@DPro Je ne sais pas comment effacer une propriété de service? pouvez-vous guider un peu!


3 Réponses :


1
votes

Vous voyez, les services angulaires sont des services singleton lorsqu'ils sont déclarés en root. Ainsi, votre constructeur ne sera appelé qu'une seule fois et à ce moment-là, il stockera le jeton. Ainsi, lorsque vous effacez le stockage local, vous devez effacer la variable. Vous pouvez créer une fonction clear dans votre service pour effacer la variable de jeton. Et appelez cette fonction lorsque vous vous déconnectez.


3 commentaires

disons que je suis sur le module de tableau de bord et que je clique sur déconnexion, puis je me connecte avec un autre compte, dans ce cas, le module de tableau de bord a le jeton précédent mais lorsque je clique sur une autre route de module, il a un nouveau jeton, je ne comprends pas comment gérer il.


Pouvez-vous recréer le problème sur stackblitz?


J'ai recréé un problème identique sur stackblitz, le scénario de lien et de cas est disponible dans la question.



1
votes

Le constructeur d'un service singleton n'est appelé qu'une seule fois pendant le chargement de l'application. Je suppose que votre service est unique. Ainsi, la logique écrite à l'intérieur du constructeur ne s'exécutera pas plus d'une fois. Vous devez également définir le jeton dans la méthode de connexion, qui s'exécute chaque fois qu'un utilisateur se connecte. Supprimez également le jeton lorsque l'utilisateur se déconnecte.

login() {
    this.auth.login(data).subscribe((response: UserToken) => {
      this.token = response.access_token;
      localStorage.setItem('eq_user', JSON.stringify(response));
      this.router.navigate([this.returnUrl]);
    },
    error => {
      this.error = true;
      this.errorMsg = error.message;
    }
  }


onLogout() {
    this.token = null;
    localStorage.removeItem('eq_user');
    localStorage.clear();
    this.authService.logout().subscribe( s => {
        this.route.navigate(['login']);
   });
  }

J'ai mis à jour votre exemple de code stackblitz avec les modifications que j'ai mentionnées ci-dessus - https://stackblitz.com/edit/angular-cz5huh


1 commentaires

le résultat est toujours le même. Je n'ai vu aucune modification du code, sauf l'ajout de AuthService dans les fournisseurs app.module.ts



2
votes

Après avoir passé presque une journée à envoyer le nouveau jeton, je trouve la solution qui peut être facilement réalisée en utilisant HttpInterceptor , si vous définissez un intercepteur personnalisé pour les en-têtes, vous ne le faites pas besoin de rechercher un jeton dans votre service, l'intercepteur ajoutera le jeton porteur à toutes les requêtes http.

Cliquez ici pour plus de détails


2 commentaires

la classe d'exportation AuthInterceptor implémente HttpInterceptor {intercept (req: HttpRequest , next: HttpHandler): Observable > {const idToken = localStorage.getItem ("jwtToken"); if (idToken) {const cloned = req.clone ({headers: req.headers.set ("Authorization", "Bearer" + idToken)}); return next.handle (cloné); } else {return next.handle (req); }}


ajoutez le provide: HTTP_INTERE3CEPTOR, useClass: AuthInterceptor en tant que fournisseur dans app.module.ts