Vérifier le jeton d'accès à chaque demande avec Redis
Je suis actuellement à la mise en œuvre d'un protocole OAuth 2.0 pour l'Architecture de mon API RESTful.
Avec chaque demande que j'ai mis en place une Autorisation Porteur du Jeton dans l'en-Tête HTTP pour tous mes clients à faire Autorisé Demandes.
Authorization: Bearer sdflksd3r4823vkn95-03850432
Je comprends qu'il est de pratique courante de simplement accepter le jeton dans l'API jusqu'à la date d'expiration. Mais disons que si un utilisateur veut révoquer le jeton, j'aurais besoin d'employer une méthode de vérification de l'état du jeton à chaque requête.
Je pensais donc aller à la Db pour vérifier, pour chaque requête HTTP. J'ai le sentiment que ce ne sera pas bien pour des raisons de performances.
Donc je me demandais si une solution comme Redis conviendrait très rapide unique lit de la jeton d'accès de l'état?
source d'informationauteur Max Alexander
Vous devez vous connecter pour publier un commentaire.
Le point d'avoir un HMAC pour un jeton est alors que le serveur peut vérifier rapidement sans faire appel à un magasin de données externes (par exemple le Redis, MySQL, etc). Ceci a l'avantage supplémentaire de l'échelle joliment de plusieurs serveur car il n'est pas partagé de l'état (toutes les infos pour vérifier le jeton, le jeton lui-même et la clé pour le HMAC).
Si vous allez avoir une liste noire de révoqué jetons alors quelque chose comme le Redis serait probablement très bien (bien que toujours plus lent que ne faisant pas appel à distance pour chaque jeton de vérification). L'installation correctement, avec un faible temps de latence entre votre Redis instance et votre serveur d'API(s), vous devez voir <10ms par demande.
Bonus: une Autre option pour accélérer les choses encore plus loin serait d'utiliser un Filtre de Bloom pour gérer la mise en cache de a rejeté les requêtes de l'API. De cette façon, vous allez Redis si la Floraison filtre drapeaux de la demande de jeton comme peut-être révoqué. Notez que puisque c'est une autre couche de mise en cache, vous aurez à mettre à jour l'état de la Floraison du filtre lorsqu'un jeton est rejetée.
J'ai mis en place quelque chose de similaire pour la manipulation de révoqué jeton généré par JWT.
Je suis en utilisant le redis pour définir révoqué jetons avec une date d'expiration, de sorte que les jetons sont automatiquement supprimés de redis. Et j'ai un middleware de vérifier dans le redis le jeton fourni. De vérifier la post complet ici. Espérons que cela aide
Je suis en train de faire quelque chose de similaire pour moi.
Pour la syntaxe du jeton et le cryptage, je vous suggère d'utiliser JWT, c'est une bonne norme.
C'est ok à l'aide de redis pour stocker une paire de jeton/userid, aussi parce que nous pouvons définir une valeur expiration.
Aussi, j'ai inséré un filtre de bloom dans le milieu, mais je l'ai fait à l'opposé de ce que sehrope suggestion: je suis le stockage de tous les jetons à l'ouverture de session par bloom filtre, donc si le jeton n'est pas présent, il est certainement invalide; le reste est probablement correct, mais je dois faire un chèque sur le Redis pour être sûr; mais maintenant j'ai un problème: si je veux augmenter ma auth système j'ai besoin d'une dynamique d'équilibrage de la charge entre auth serveurs.
À mon humble avis, à l'aide d'un filtre de bloom pour créer une liste noire n'est pas correct: si je la liste noire en fleurs filtre révoqué et le mal de jetons, si l'article n'est pas sur la liste noire de la floraison filtre renvoie la valeur faux (et j'ai vérifier dans le redis backend d'authentification); d'autre si un élément est présent (liste noire) j'ai vérifier sur le redis pour être sûr, parce que bloom filtre vraie réponse peut être un faux positif.