Auth0 m2m token expiration
Cache Auth0 M2M Tokens
Auth0 est un service facile à intégrer qui gère tous les besoins d’authentification de vos applications. Mais, si vous avez déjà travaillé avec, vous saurez que c’est ses inconvénients.
L’un d’entre eux est un jeton M2M (Machine-to-Machine), utilisé pour s’authentifier entre vos services.
Mais les limites sont restrictives pour les infrastructures sans serveur. Dans le plan gratuit, vous n’obtenez que 1000 par mois. Et même avec un plan payant, il serait coûteux d’obtenir le nombre de jetons dont vous pourriez avoir besoin au cours d’un mois donné.
La solution consiste à mettre en cache les jetons Machine-to-Machine afin que nous n’ayons pas besoin d’en demander de nouveaux jusqu’à ce qu’ils expirent.
Dans les infrastructures traditionnelles, ce serait trivial. Enregistrez le jeton globalement quelque part et c’est fait.
Les architectures sans serveur sont délicates car il n’y a pas de persistance entre les instances.
Voici comment procéder pour gérer la mise en cache des jetons Auth0 pour les microservices AWS Lambda. Mais les mêmes principes s’appliquent aux autres fournisseurs de cloud.
Créez la table DynamoDB
(ou une table de base de données sans serveur équivalente chez d’autres fournisseurs de cloud)
Définissez votre propre nom pour la table et définissez la clé de partition sur en tant que chaîne Ajouter
le nom de la table en tant que variable d’environnement
Récupérer et stocker des jetons
Tout d’abord, ajoutons une méthode pour stocker le nouveau M2M
Le code est assez simple et assez explicite.
Passons donc à la méthode que nous pouvons utiliser dans notre gestionnaire Lambda pour récupérer un nouveau jeton M2M.
Il existe deux chemins d’accès pour cette méthode
- : il existe un jeton non expiré dans DynamoDB, nous l’utilisons donc.
- Il n’y a pas de jeton ou seulement des jetons expirés, nous en générons donc un nouveau, le stockons dans DynamoDB et utilisez-le.
Nous allons concevoir ce système pour ne stocker qu’un seul jeton à la fois. Cela signifie que nous n’avons pas à nous soucier des anciens jetons et à les filtrer à chaque initialisation.
Alors écrivons notre méthode !
Décomposons cela un peu
- : nous obtenons d’abord le jeton existant dans DynamoDB . Il renvoie le jeton ou une chaîne vide.
- S’il renvoie un jeton, nous vérifions qu’il n’a pas expiré, puis nous renvoyons ce jeton.
- S’il est expiré ou s’il n’y a pas de jeton, nous allons de l’avant et en générons un à partir de Auth0 .
- Nous supprimons ensuite l’ancien jeton dans DynamoDB et stockons le nouveau .
Potentiellement, avec ce flux (et le fait que DynamoDB n’est pas verrouillable), cela peut signifier que plusieurs instances de votre service enregistrent un jeton en même temps. Mais, cela sera mineure par rapport à ce que vous pouvez économiser en mettant en cache en premier lieu.
Créons maintenant les méthodes que nous avons référencées dans la fonction qui nous aident à interagir avec le stockage et la validation des jetons
Encore une fois, décomposons cela
- en récupérant tous les jetons existants et les supprimons un par un. Cela permet d’éviter les problèmes de concurrence lorsqu’une autre instance a écrit un nouveau jeton que nous ne voulons pas supprimer.
- Dans nous effectuons une validation JWT de base pour nous assurer qu’il n’est pas expiré. Cela pourrait être amélioré en n’utilisant pas le jeton s’il ne lui reste que 1 ms, mais cela a fonctionné jusqu’à présent pour moi.
- Dans nous récupérons toutes les lignes de la table et retournons le premier jeton ou une chaîne vide si aucun n’est trouvé.
Utilisation dans le gestionnaire
Il ne vous reste plus qu’à l’ajouter à votre méthode de gestionnaire de fonctions Lambda.
J’espère que vous avez trouvé ceci intéressant et économisé de l’argent sur votre facture Auth0 !