Le maintien des sessions utilisateur sans connexions constantes est la clé d'une expérience Web fluide. Dans ce blog, je vais vous montrer comment implémenter un workflow d'actualisation de jetons dans Angular, en gérant les erreurs 401 et en gérant efficacement les demandes simultanées.
Qu'est-ce qu'un flux de travail de jeton d'actualisation ?
Dans les systèmes d'authentification, les jetons d'accès ont une courte durée de vie pour minimiser les risques de sécurité. Lorsqu'un jeton d'accès expire, le jeton d'actualisation permet à l'application de demander un nouveau jeton d'accès au serveur sans nécessiter que l'utilisateur se reconnecte.
Implémentation angulaire
Nous allons implémenter un mécanisme de jeton d'actualisation à l'aide du HttpInterceptor d'Angular. L'objectif est d'intercepter les requêtes non autorisées (erreurs 401) et d'actualiser le token avant de réessayer la requête d'origine.
Flux de travail complet
Demande d'interception :
Un intercepteur détecte une réponse 401 non autorisée.Actualisation du jeton :
Si le jeton est expiré, rafraîchirToken récupère un nouveau jeton.Demande de nouvelle tentative :
La demande d'origine est réessayée avec le nouveau jeton.Gestion des files d'attente :
Les demandes en attente sont traitées une fois le jeton actualisé.
Présentation du code
- Logique d'actualisation des jetons La méthode handleUnauthorized gère l'actualisation du jeton lorsqu'une demande échoue en raison d'un jeton expiré.
handleUnauthorized( req: HttpRequest<any>, next: HttpHandlerFn ): Observable<any> { if (!this.isRefreshingToken) { this.isRefreshingToken = true; // Notify all waiting requests that the token is being refreshed this.tokenSubject.next(null); return this.refreshToken().pipe( switchMap((newToken: string) => { if (newToken) { this.tokenSubject.next(newToken); // Retry the original request with the new token return next(this.addToken(req, newToken)); } // If token refresh fails, log out the user this.logout(); return throwError(() => 'Token expired'); }), catchError((error) => { this.logout(); // Log out on error return throwError(() => error); }), finalize(() => { this.isRefreshingToken = false; // Reset the flag }), ); } else { // Queue requests while a token is being refreshed return this.tokenSubject.pipe( filter((token) => token != null), take(1), switchMap((token) => next(this.addToken(req, token))), ); } } </any></any>
La fonction handleUnauthorized est conçue pour gérer les scénarios dans lesquels une requête HTTP reçoit un statut 401 non autorisé, indiquant que le jeton d'accès a expiré ou n'est pas valide. Cette fonction garantit que l'application peut actualiser le jeton et réessayer la demande ayant échoué de manière transparente.
- Empêcher plusieurs demandes d'actualisation La fonction utilise l'indicateur isRefreshingToken pour garantir qu'une seule demande d'actualisation de jeton est effectuée à la fois. Si le jeton est déjà en cours d'actualisation, les demandes suivantes sont mises en file d'attente jusqu'à ce que le nouveau jeton soit disponible.
handleUnauthorized( req: HttpRequest<any>, next: HttpHandlerFn ): Observable<any> { if (!this.isRefreshingToken) { this.isRefreshingToken = true; // Notify all waiting requests that the token is being refreshed this.tokenSubject.next(null); return this.refreshToken().pipe( switchMap((newToken: string) => { if (newToken) { this.tokenSubject.next(newToken); // Retry the original request with the new token return next(this.addToken(req, newToken)); } // If token refresh fails, log out the user this.logout(); return throwError(() => 'Token expired'); }), catchError((error) => { this.logout(); // Log out on error return throwError(() => error); }), finalize(() => { this.isRefreshingToken = false; // Reset the flag }), ); } else { // Queue requests while a token is being refreshed return this.tokenSubject.pipe( filter((token) => token != null), take(1), switchMap((token) => next(this.addToken(req, token))), ); } } </any></any>
- Actualiser le jeton Si aucune demande d'actualisation n'est en cours, il lance une actualisation du jeton à l'aide de la méthodefreshToken. Une fois un nouveau jeton reçu :
- Il est stocké dans le tokenSubject.
- La demande d'origine est réessayée avec le jeton mis à jour.
if (!this.isRefreshingToken) { this.isRefreshingToken = true; this.tokenSubject.next(null);
- Gérer les demandes simultanées Si une actualisation du jeton est déjà en cours, la fonction met en file d'attente les requêtes suivantes. Ces requêtes attendent que le tokenSubject émette le nouveau jeton avant de continuer.
return this.refreshToken(url).pipe( switchMap((newToken: string) => { if (newToken) { this.tokenSubject.next(newToken); return next(this.addToken(req, newToken)); } this.logout(); return throwError(() => 'Token expired'); }),
- Gestion des erreurs Si l'actualisation du jeton échoue ou génère une exception :
- L'utilisateur est déconnecté.
- Une erreur est renvoyée à l'appelant.
return this.tokenSubject.pipe( filter((token) => token != null), // Wait for a non-null token take(1), // Only take the first emitted token switchMap((token) => next(this.addToken(req, token))), );
- Nettoyage L'opérateur finalize garantit que l'indicateur isRefreshingToken est réinitialisé, permettant ainsi les demandes d'actualisation ultérieures.
catchError((error) => { this.logout(); return throwError(() => error); }),
Ajout du jeton aux requêtes
La méthode addToken ajoute le nouveau jeton aux en-têtes de la requête sortante.
finalize(() => { this.isRefreshingToken = false; }),
L'utiliser dans un intercepteur HTTP angulaire
Un HttpInterceptor est l'endroit idéal pour implémenter ce workflow. Il vous permet d'intercepter toutes les requêtes HTTP et de gérer la gestion des jetons globalement sans modifier les appels de service individuels.
addToken(request: HttpRequest<any>, token: string): HttpRequest<any> { return request.clone({ setHeaders: { 'X-Token': token, }, }); } </any></any>
En résumé, un solide workflow d'actualisation des jetons garantit une expérience utilisateur transparente et une gestion sécurisée des sessions dans les applications Angular. En traitant efficacement les erreurs 401 et en gérant les demandes simultanées, vous pouvez maintenir la fiabilité et satisfaire vos utilisateurs. Merci d'avoir lu, n'hésitez pas à partager vos réflexions ou vos questions ci-dessous !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Le passage de C / C à JavaScript nécessite de s'adapter à la frappe dynamique, à la collecte des ordures et à la programmation asynchrone. 1) C / C est un langage dactylographié statiquement qui nécessite une gestion manuelle de la mémoire, tandis que JavaScript est dynamiquement typé et que la collecte des déchets est automatiquement traitée. 2) C / C doit être compilé en code machine, tandis que JavaScript est une langue interprétée. 3) JavaScript introduit des concepts tels que les fermetures, les chaînes de prototypes et la promesse, ce qui améliore la flexibilité et les capacités de programmation asynchrones.

Différents moteurs JavaScript ont des effets différents lors de l'analyse et de l'exécution du code JavaScript, car les principes d'implémentation et les stratégies d'optimisation de chaque moteur diffèrent. 1. Analyse lexicale: convertir le code source en unité lexicale. 2. Analyse de la grammaire: générer un arbre de syntaxe abstrait. 3. Optimisation et compilation: générer du code machine via le compilateur JIT. 4. Exécuter: Exécutez le code machine. Le moteur V8 optimise grâce à une compilation instantanée et à une classe cachée, SpiderMonkey utilise un système d'inférence de type, résultant en différentes performances de performances sur le même code.

Les applications de JavaScript dans le monde réel incluent la programmation côté serveur, le développement des applications mobiles et le contrôle de l'Internet des objets: 1. La programmation côté serveur est réalisée via Node.js, adaptée au traitement de demande élevé simultané. 2. Le développement d'applications mobiles est effectué par le reactnatif et prend en charge le déploiement multiplateforme. 3. Utilisé pour le contrôle des périphériques IoT via la bibliothèque Johnny-Five, adapté à l'interaction matérielle.

J'ai construit une application SAAS multi-locataire fonctionnelle (une application EdTech) avec votre outil technologique quotidien et vous pouvez faire de même. Premièrement, qu'est-ce qu'une application SaaS multi-locataire? Les applications saas multi-locataires vous permettent de servir plusieurs clients à partir d'un chant

Cet article démontre l'intégration frontale avec un backend sécurisé par permis, construisant une application fonctionnelle EdTech SaaS en utilisant Next.js. Le frontend récupère les autorisations des utilisateurs pour contrôler la visibilité de l'interface utilisateur et garantit que les demandes d'API adhèrent à la base de rôles

JavaScript est le langage central du développement Web moderne et est largement utilisé pour sa diversité et sa flexibilité. 1) Développement frontal: construire des pages Web dynamiques et des applications à une seule page via les opérations DOM et les cadres modernes (tels que React, Vue.js, Angular). 2) Développement côté serveur: Node.js utilise un modèle d'E / S non bloquant pour gérer une concurrence élevée et des applications en temps réel. 3) Développement des applications mobiles et de bureau: le développement de la plate-forme multiplateuse est réalisé par réact noral et électron pour améliorer l'efficacité du développement.

Les dernières tendances de JavaScript incluent la montée en puissance de TypeScript, la popularité des frameworks et bibliothèques modernes et l'application de WebAssembly. Les prospects futurs couvrent des systèmes de type plus puissants, le développement du JavaScript côté serveur, l'expansion de l'intelligence artificielle et de l'apprentissage automatique, et le potentiel de l'informatique IoT et Edge.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

ZendStudio 13.5.1 Mac
Puissant environnement de développement intégré PHP

VSCode Windows 64 bits Télécharger
Un éditeur IDE gratuit et puissant lancé par Microsoft

Version Mac de WebStorm
Outils de développement JavaScript utiles