Skip to main content
Avec l’authentification renforcée, les applications qui donnent accès à différents types de ressources peuvent exiger que les utilisateurs s’authentifient au moyen d’un mécanisme plus robuste pour accéder à des informations sensibles ou effectuer certaines transactions. Par exemple, l’utilisateur d’une application bancaire peut être autorisé à transférer de l’argent entre des comptes seulement après avoir confirmé son identité au moyen de l’ (MFA). Lorsque votre est une API, vous pouvez mettre en œuvre l’authentification renforcée avec Auth0 à l’aide de scopes, de et d’Actions. Lorsqu’une application veut accéder aux ressources protégées d’une API, elle doit fournir un jeton d’accès. Les ressources auxquelles elle peut accéder dépendent des autorisations incluses dans le jeton d’accès. Ces autorisations sont définies sous forme de scopes.

Valider les jetons d’accès dans le cadre de la MFA

En plus de vérifier le scope, l’API doit valider le jeton d’accès pour :
  • Vérifier la signature du jeton, qui sert à confirmer que l’expéditeur est bien celui qu’il prétend être et à s’assurer que le message n’a pas été modifié en cours de route.
  • Valider les claims standard :

Scénario : transactions bancaires avec notifications push

Dans le scénario suivant, une application authentifie un utilisateur à l’aide d’un nom d’utilisateur et d’un mot de passe, puis demande le solde d’un compte. Avant de récupérer les renseignements sur le solde du compte, l’utilisateur doit s’authentifier avec le facteur push Guardian. L’API bancaire peut accepter deux niveaux d’autorisation différents : consulter le solde du compte (scope view:balance) ou transférer des fonds (scope transfer:funds). Lorsque l’application demande à l’API de récupérer le solde de l’utilisateur, le jeton d’accès doit contenir le scope view:balance. Pour transférer de l’argent vers un autre compte, le jeton d’accès doit contenir le scope transfer:funds.

Flux de travail

  1. L’utilisateur se connecte à l’application à l’aide d’un nom d’utilisateur et d’un mot de passe. La connexion standard lui permet d’interagir avec l’API et de récupérer son solde. Cela signifie que le jeton d’accès que l’application reçoit après son authentification contient le scope view:balance.
  2. L’application envoie une requête à l’API pour récupérer le solde, en utilisant le jeton d’accès comme justificatif d’authentification.
  3. L’API valide le jeton et envoie les renseignements sur le solde à l’application afin que l’utilisateur puisse les consulter.
  4. L’utilisateur veut transférer des fonds d’un compte à un autre, ce qui est considéré comme une transaction de grande valeur nécessitant le scope transfer:funds. L’application envoie une requête à l’API en utilisant le même jeton d’accès.
  5. L’API valide le jeton et refuse l’accès parce qu’il ne contient pas le scope transfer:funds requis.
  6. L’application redirige l’utilisateur vers Auth0, où une Action est utilisée pour lui demander de s’authentifier avec MFA, puisqu’un scope de grande valeur a été demandé. Une fois l’authentification MFA réussie, un nouveau jeton d’accès incluant le bon scope est généré et envoyé à l’application dans la réponse.
  7. L’application envoie une nouvelle requête de transfert de fonds en utilisant le nouveau jeton d’accès, qui inclut cette fois le scope transfer:funds.
  8. L’API valide le jeton, l’écarte, puis poursuit l’opération.

Prérequis

Pour ce scénario, vous devez configurer les éléments suivants dans Auth0 Dashboard :

Créer une Action

Créez une Action qui demande à l’utilisateur de s’authentifier avec MFA lorsque le scope transfer:funds est demandé. Accédez à Auth0 Dashboard > Actions > Flows et créez une Action contenant le contenu suivant :
  • La variable CLIENTS_WITH_MFA contient les des applications auxquelles vous voulez appliquer cette Action. Vous pouvez supprimer cette partie (ainsi que la condition if qui suit) si vous n’en avez pas besoin.
  • La propriété event.transaction.requested_scopes contient tous les scopes demandés par la requête d’authentification. Si elle inclut la valeur transfer:funds, nous demandons une authentification MFA en définissant la propriété context.multifactor sur la valeur appropriée. Dans ce cas, nous demandons la MFA à l’aide de push.

Configurer l’application

Configurez l’application pour qu’elle envoie à l’API la requête d’authentification appropriée, selon que l’utilisateur tente ou non d’effectuer un virement, une transaction à montant élevé. Notez que la seule différence entre les deux requêtes d’authentification (avec ou sans MFA) est le scope.
  • Avec MFA : export const codeExample1 = https://{yourDomain}/authorize? audience=https://my-banking-api& scope=openid%20view:balance%20transfer:funds& response_type=id_token%20token& client_id={yourClientId}& redirect_uri={https://yourApp/callback}& nonce=NONCE& state=OPAQUE_VALUE;
  • Sans MFA : export const codeExample2 = https://{yourDomain}/authorize? audience=https://my-banking-api& scope=openid%20view:balance& response_type=id_token%20token& client_id={yourClientId}& redirect_uri={https://yourApp/callback}& nonce=NONCE& state=OPAQUE_VALUE;

Configurer l’API

Configurez l’API pour valider le jeton reçu et vérifier les autorisations accordées.
  1. Configurez deux points de terminaison pour notre API : GET /balance : pour récupérer le solde actuel POST /transfer : pour transférer des fonds
  2. Utilisez Node.js et plusieurs modules :
    1. express : ajoute le framework d’applications Web Express.
    2. jwks-rsa : récupère les clés de signature RSA à partir d’un point de terminaison JWKS (jeu de clés Web JSON). Avec expressJwtSecret, nous pouvons générer un fournisseur de secrets qui fournira à express-jwt la bonne clé de signature en fonction du kid dans l’en-tête JWT.
    3. express-jwt : vous permet d’authentifier les requêtes HTTP à l’aide de JWT dans vos applications Node.js. Il fournit plusieurs fonctions qui facilitent l’utilisation des JWT.
    4. express-jwt-authz : vérifie si le jeton d’accès contient un scope précis.
  3. Installez les dépendances : npm install express express-jwt jwks-rsa express-jwt-authz --save
  4. Définissez les points de terminaison de l’API, créez une fonction middleware pour valider le jeton d’accès et sécurisez les points de terminaison à l’aide de ce middleware. Le code de votre fichier server.js devrait ressembler à l’exemple de script suivant :
Chaque fois que l’API reçoit une requête, voici ce qui se produit :
  1. Le point de terminaison appelle le middleware checkJwt. 2. express-jwt décode le jeton et transmet la requête, l’en-tête et la charge utile à jwksRsa.expressJwtSecret. 3. jwks-rsa télécharge toutes les clés de signature à partir du point de terminaison JWKS et vérifie si l’une d’elles correspond au kid de l’en-tête du jeton d’accès. Si aucune clé de signature ne correspond au kid reçu, une erreur est générée. S’il y a correspondance, la bonne clé de signature est transmise à express-jwt. 4. express-jwt poursuit ensuite son propre traitement pour valider la signature du jeton, l’expiration, l’audience et l’émetteur. 5. jwtAuthz vérifie si le scope exigé par le point de terminaison fait partie du jeton d’accès. Si les scopes spécifiés sont absents du jeton d’accès, la requête est rejetée avec un message d’erreur 403.

En savoir plus