Skip to main content
Ce document fait partie du scénario d’architecture SPA + API et explique comment mettre en œuvre le SPA avec Angular 2. Veuillez consulter le scénario pour en savoir plus sur la solution mise en œuvre. Le code source complet de la mise en œuvre Angular 2 du SPA se trouve dans ce dépôt GitHub.

Étape 1. Configuration

Votre application aura besoin de certaines informations de configuration. Avant de poursuivre la mise en œuvre, créez une interface AuthConfig qui contiendra différentes valeurs de configuration. Placez cette interface dans un fichier appelé auth0-variables.ts.

Étape 2. Autoriser l’utilisateur

Créer un service d’autorisation

La meilleure façon de gérer et de coordonner les tâches nécessaires à l’authentification de l’utilisateur est de créer un service réutilisable. Une fois ce service en place, vous pourrez appeler ses méthodes partout dans votre application. Vous pouvez créer dans ce service une instance de l’objet WebAuth de auth0.js.
Le service comprend plusieurs méthodes pour gérer l’authentification.
  • login : appelle authorize de auth0.js, ce qui lance
  • handleAuthentication : recherche un résultat d’authentification dans le hachage de l’URL et le traite à l’aide de la méthode parseHash d’auth0.js
  • setSession : définit le de l’utilisateur, son , ainsi que l’heure à laquelle le jeton d’accès expirera
  • logout : supprime les jetons de l’utilisateur du stockage du navigateur isAuthenticated: vérifie si l’heure d’expiration du jeton d’accès est passée

Traiter le résultat de l’authentification

Lorsqu’un utilisateur s’authentifie au moyen d’Universal Login, puis qu’il est redirigé vers votre application, ses informations d’authentification se trouvent dans un fragment de hachage de l’URL. La méthode handleAuthentication de AuthService est chargée de traiter le hachage. Appelez handleAuthentication dans le composant racine de votre application afin que le fragment de hachage d’authentification puisse être traité au premier chargement de l’application après la redirection de l’utilisateur.

Ajouter le composant Callback

L’utilisation de Universal Login signifie que les utilisateurs sont redirigés hors de votre application vers une page hébergée par Auth0. Une fois leur authentification réussie, ils sont renvoyés vers votre application, où une session côté client est créée pour eux. Vous pouvez choisir de faire revenir les utilisateurs vers n’importe quelle URL de votre application; toutefois, il est recommandé de créer une route de rappel dédiée qui servira de point central vers lequel l’utilisateur sera redirigé après une authentification réussie. Le fait d’avoir une seule route de rappel présente deux grands avantages :
  • Cela évite d’avoir à mettre sur liste d’autorisation plusieurs URL de rappel (parfois même inconnues)
  • Cela permet d’afficher un indicateur de chargement pendant que votre application crée la session côté client de l’utilisateur
Créez un composant nommé CallbackComponent et ajoutez-y un indicateur de chargement.
Cet exemple suppose qu’un indicateur de chargement est disponible dans le répertoire assets. Consultez l’exemple à télécharger pour en voir une démonstration. Après l’authentification, les utilisateurs seront brièvement redirigés vers la route /callback, où un indicateur de chargement s’affichera. Pendant ce temps, leur session côté client sera établie, puis ils seront redirigés vers la route /home.

Étape 3. Obtenir le profil de l’utilisateur

Extraire des renseignements du jeton

Cette section explique comment récupérer les renseignements de l’utilisateur à l’aide du jeton d’accès et du point de terminaison /userinfo. Vous pouvez aussi simplement décoder le ID Token à l’aide d’une bibliothèque (assurez-vous d’abord de le valider). Le résultat sera le même. Si vous avez besoin de renseignements supplémentaires sur l’utilisateur, envisagez d’utiliser notre Management API.
Pour obtenir le profil de l’utilisateur, mettez à jour la classe AuthService existante. Ajoutez une fonction getProfile qui extraira le jeton d’accès de l’utilisateur du stockage local, puis le transmettra à la fonction userInfo pour récupérer les renseignements de l’utilisateur.
Vous pouvez maintenant simplement appeler cette fonction à partir de n’importe quel service depuis lequel vous souhaitez récupérer et afficher des renseignements sur l’utilisateur. Par exemple, vous pouvez choisir de créer un nouveau composant pour afficher les renseignements du profil de l’utilisateur :
Le gabarit de ce composant se présente comme suit :

Étape 4. Afficher les éléments de l’UI de façon conditionnelle selon la portée

Pendant le processus d’autorisation, nous avons déjà enregistré dans le stockage local les portées réellement accordées à l’utilisateur. Si le scope renvoyé dans authResult n’est pas vide, cela signifie que l’utilisateur a reçu un ensemble de portées différent de celui demandé au départ; nous devons donc utiliser authResult.scope pour déterminer les portées qui lui ont été accordées. Si le scope renvoyé dans authResult est vide, cela signifie que l’utilisateur a obtenu toutes les portées demandées; nous pouvons donc utiliser les portées demandées pour déterminer celles qui lui ont été accordées. Voici le code que nous avons écrit plus tôt pour la fonction setSession qui effectue cette vérification :
Nous devons ensuite ajouter à la classe AuthService une fonction permettant de déterminer si un utilisateur a reçu un scope précis :
Vous pouvez appeler cette méthode pour déterminer si nous devons afficher ou non un élément précis de l’interface utilisateur. Par exemple, nous voulons afficher le lien Approve Timesheets seulement si l’utilisateur possède la portée approve:timesheets. Notez que, dans le code ci-dessous, nous avons ajouté un appel à la fonction userHasScopes pour déterminer si ce lien doit être affiché ou non.

Protéger une route

Nous devrions aussi protéger une route afin d’empêcher un utilisateur d’y accéder s’il ne s’est pas vu accorder les scopes appropriés. Pour ce faire, nous pouvons ajouter une nouvelle classe de service ScopeGuardService :
Servez-vous-en ensuite lors de la configuration des routes pour déterminer si une route peut être activée. Remarquez l’utilisation du nouveau ScopeGuardService dans la définition de la route approval ci-dessous :

Étape 5. Appeler l’API

Le module angular2-jwt peut être utilisé pour joindre automatiquement des aux requêtes adressées à votre API. Pour ce faire, il fournit une classe AuthHttp qui encapsule la classe Http d’Angular. Installez angular2-jwt :
Créez une fonction de fabrique contenant quelques valeurs de configuration pour angular2-jwt, puis ajoutez-la au tableau providers de l’@NgModule de votre application. La fonction de fabrique doit inclure une fonction tokenGetter qui récupère l’access_token à partir du stockage local.
Une fois angular2-jwt configuré, vous pouvez utiliser la classe AuthHttp pour effectuer des requêtes sécurisées vers votre API depuis n’importe où dans l’application. Pour ce faire, injectez AuthHttp dans tout composant ou service qui en a besoin et utilisez-le comme vous le feriez avec la classe Http standard d’Angular.

Étape 6. Renouveler le jeton d’accès

Le renouvellement du jeton d’accès de l’utilisateur nécessite une mise à jour de la SPA Angular. Ajoutez une méthode à AuthService qui appelle la méthode checkSession d’auth0.js. Si le renouvellement réussit, utilisez la méthode setSession existante pour enregistrer les nouveaux jetons dans le stockage local.
Dans la classe AuthService, ajoutez une méthode appelée scheduleRenewal pour définir le moment où l’authentification doit être renouvelée en silence. Dans l’exemple ci-dessous, elle est configurée pour s’exécuter 30 secondes avant l’expiration réelle du jeton. Ajoutez également une méthode appelée unscheduleRenewal pour annuler l’abonnement à l’Observable.
Enfin, vous devez démarrer le renouvellement planifié. Pour ce faire, appelez scheduleRenewal dans votre AppComponent, afin qu’il s’exécute au chargement de la page. Cela se produira après chaque flux d’authentification, soit lorsque l’utilisateur se connecte explicitement, soit lors d’une authentification silencieuse.

Rotation des jetons d’actualisation

Les récentes avancées des contrôles de confidentialité dans les navigateurs nuisent à l’expérience utilisateur en bloquant l’accès aux cookies tiers. Auth0 recommande d’utiliser la rotation des jetons d’actualisation, qui offre une méthode sécurisée pour utiliser des jetons d’actualisation dans les SPA, tout en donnant aux utilisateurs finaux un accès fluide aux ressources, sans les perturbations de l’expérience utilisateur causées par des technologies de confidentialité des navigateurs comme ITP.