Valider les jetons d’accès pour MFA
- Vérifier la signature du jeton, afin de confirmer que l’émetteur du jeton est bien celui qu’il prétend être et de s’assurer que le message n’a pas été modifié en cours de route.
- Valider les claims standard :
Scénario : Transactions bancaires avec des notifications push
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
- L’utilisateur se connecte à l’application à l’aide de l’authentification par nom d’utilisateur et 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 l’authentification de l’utilisateur contient le scope
view:balance. - 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.
- L’API valide le jeton et envoie les renseignements sur le solde à l’application pour que l’utilisateur puisse les consulter.
- 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. - L’API valide le jeton et refuse l’accès, car il lui manque le scope
transfer:fundsrequis. - L’application redirige l’utilisateur vers Auth0, où une Action sert à 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 contenant le bon scope est généré et envoyé à l’application dans la réponse.
- L’application envoie une autre requête de transfert de fonds en utilisant le nouveau jeton d’accès, qui comprend cette fois le scope
transfer:funds. - L’API valide le jeton, l’écarte, puis poursuit l’opération.
Prérequis
- Enregistrer une application Web monopage.
- Créer une connexion de base de données.
- Enregistrer l’API. Créez deux scopes :
view:balanceettransfer:funds. - Activer MFA pour utiliser les notifications push.
Créer une Action
transfer:funds est demandé. Accédez à Dashboard > Actions > Flows et créez une Action contenant le contenu suivant :
- La variable
CLIENTS_WITH_MFAcontient les des applications auxquelles vous voulez appliquer cette Action. Vous pouvez supprimer cet élément (ainsi que la conditionifqui suit) si vous n’en avez pas besoin. - La propriété
event.transaction.requested_scopescontient tous les scopes demandés par la requête d’authentification. Si elle inclut la valeurtransfer:funds, nous demandons alors la MFA en définissant la propriétécontext.multifactorsur la valeur appropriée. Dans ce cas-ci, nous demandons la MFA au moyen de push.
Configurer l’application
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 deux points de terminaison pour notre API :
GET /balance: pour récupérer le solde actuelPOST /transfer: pour transférer des fonds -
Utilisez
Node.jset plusieurs modules :- express : ajoute le framework d’application web Express.
- jwks-rsa : récupère les clés de signature RSA à partir d’un point de terminaison JWKS (JSON Web Key Set). Avec
expressJwtSecret, nous pouvons générer un fournisseur de secret qui remettra la bonne clé de signature àexpress-jwten fonction dukiddans l’en-tête du JWT. - express-jwt : permet d’authentifier les requêtes HTTP à l’aide de jetons JWT dans vos applications Node.js. Il fournit plusieurs fonctions qui facilitent l’utilisation des JWT.
- express-jwt-authz : vérifie si le jeton d’accès contient un scope précis.
-
Installez les dépendances :
npm install express express-jwt jwks-rsa express-jwt-authz --save -
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.jsdevrait ressembler à l’exemple de script suivant :
- Le point de terminaison appelle le middleware
checkJwt. 2.express-jwtdécode le jeton et transmet la requête, l’en-tête et la charge utile àjwksRsa.expressJwtSecret. 3.jwks-rsatélécharge toutes les clés de signature depuis le point de terminaison JWKS et vérifie si l’une d’elles correspond aukiddans l’en-tête du jeton d’accès. Si aucune clé de signature ne correspond aukidreçu, une erreur est générée. S’il y a correspondance, la bonne clé de signature est transmise àexpress-jwt. 4.express-jwtpoursuit ensuite sa logique pour valider la signature du jeton, l’expiration, l’audience et l’émetteur. 5.jwtAuthzvérifie si le scope exigé par le point de terminaison fait partie du jeton d’accès. Si les scopes précisés sont absents du jeton d’accès, la requête est rejetée avec un message d’erreur 403.