Valider les jetons d’accès dans le cadre de la MFA
- 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
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 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. - 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 afin 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 parce qu’il ne contient pas le scope
transfer:fundsrequis. - 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.
- 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. - 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 à Auth0 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 cette partie (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 une authentification MFA en définissant la propriétécontext.multifactorsur la valeur appropriée. Dans ce cas, nous demandons la MFA à l’aide de push.
Configurer l’application
-
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’applications Web Express.
- 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-jwtla bonne clé de signature en fonction dukiddans l’en-tête JWT. - 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.
- 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 à partir du point de terminaison JWKS et vérifie si l’une d’elles correspond aukidde 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 son propre traitement 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 spécifiés sont absents du jeton d’accès, la requête est rejetée avec un message d’erreur 403.