114 votes

Comment vérifier JWT d'AWS Cognito dans le backend de l'API?

Je suis en train de construire un système composé d'un Angular2 single page app et une API REST en cours d'exécution sur l'ECS. L'API fonctionne sur .Net/Nancy, mais cela pourrait bien changer.

Je voudrais donner Cognito de l'essayer et c'est ainsi que j'ai imaginé le flux de travail d'authentification:

  1. SPA signes de l'utilisateur et reçoit un JWT
  2. SPA envoie JWT à l'API REST avec chaque demande
  3. API REST verfies que le JWT est authentique

Ma question est sur l'étape 3. Comment mon serveur (ou plutôt: mon apatrides, auto-échelle, à charge équilibrée des conteneurs Docker) vérifier que le jeton est authentique? Depuis le "serveur" n'a pas été émis le JWT lui-même, il ne peut pas utiliser son propre secret (comme décrit dans la base de JWT exemple ici).

J'ai lu à travers le Cognito docs et google beaucoup, mais je ne peux pas trouver une bonne ligne directrice pour la JWT sur le côté serveur.

54voto

EagleBeak Points 2260

S'avère que je n'ai pas lu les docs droit. C'est expliqué ici (faites défiler jusqu'à la section "Utilisation de l'ID de Jetons et Jetons d'Accès de votre site Web Api").

L'API de service pouvez télécharger Cognito de secrets et de les utiliser pour vérifier reçu JWT est. Parfait.

Modifier

@Groady commentaire est sur le point: mais comment validez-vous les jetons? Je dirais que l'utilisation d'un des combats de la bibliothèque comme jose4j ou nimbus (Java) pour cela et ne pas mettre en œuvre la vérification à partir de zéro vous-même.

Ici's un exemple de mise en œuvre pour le Printemps de Démarrage à l'aide nimbus qui m'a commencé quand j'ai récemment eu à mettre en java/dropwizard service.

48voto

FacePalm Points 2369

Voici un moyen de vérifier la signature sur NodeJS:

 var jwt = require('jsonwebtoken');
var jwkToPem = require('jwk-to-pem');
var pem = jwkToPem(jwk);
jwt.verify(token, pem, function(err, decoded) {
  console.log(decoded)
});


// Note : You can get jwk from https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json 
 

18voto

Gautam Jain Points 115

Réponse courte:
Vous pouvez obtenir la clé publique de l'utilisateur de votre piscine à partir de l'endpoint suivant:
https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
Si vous avez réussi à décoder le jeton à l'aide de cette clé publique alors le jeton est valide d'autre, c'est faux.


Réponse longue:
Après avoir réussi à s'authentifier via cognito, vous obtenez votre accès et votre id de jetons. Maintenant, vous voulez valider si ce jeton a été manipulé ou non. Traditionnellement, nous envoyer ces jetons de retour pour le service d'authentification (qui a délivré ce jeton à la première place), afin de vérifier si le jeton est valide. Ces systèmes utilisent l' symmetric key encryption algorithmes tels que HMAC pour chiffrer la charge à l'aide d'une clé secrète; c'est ainsi que ce système est capable de dire si ce jeton est valide ou pas.
Traditionnelle auth JWT jeton d'en-Tête:

{
   "alg": "HS256",
   "typ": "JWT"
}

Notez ici que l'algorithme de chiffrement utilisé ici est symétrique - HMAC + SHA256

Mais les modernes systèmes d'authentification comme Cognito utiliser asymmetric key encryption algorithmes tels que RSA pour chiffrer la charge à l'aide d'une paire de clés publique et privée. La charge utile est chiffré à l'aide d'une clé privée, mais peut être décodé par clé publique. Avantage majeur de l'utilisation d'un tel algorithme est que nous n'avons pas à demander un seul service d'authentification de dire si un jeton est valide ou pas. Puisque tout le monde a accès à la clé publique, n'importe qui peut vérifier la validité du jeton. La charge de la validation est bien réparti et il n'y a pas de point de défaillance unique.
Cognito JWT jeton d'en-tête:

{
  "kid": "abcdefghijklmnopqrsexample=",
  "alg": "RS256"
}

Le chiffrement asymétrique algorithme utilisé dans ce cas - RSA + SHA256

10voto

Dave Kierans Points 641

J'ai eu un problème similaire, mais sans l'aide de la Passerelle API. Dans mon cas, j'ai voulu vérifier la signature d'un JWT jeton obtenu via AWS Cognito Développeur identité Authentifiée route.

Comme beaucoup d'affiches sur divers sites, j'ai eu de la difficulté à reconstituer exactement les bits que je doit vérifier la signature d'une AWS JWT jeton de l'extérieur c'est à dire, côté serveur ou via le script

Je pense que j'ai compris et de mettre un résumé de vérifier une AWS JWT jeton de signature. Il s'agira de vérifier AWS JWT/JWS jeton soit pyjwt ou PKCS1_v1_5c de Crypto.La Signature de PyCrypto

Donc, oui, c'est python dans mon cas, mais c'est aussi faisable facilement en nœud (npm install jsonwebtoken jwk-à-pem demande).

J'ai essayé de mettre en évidence certaines erreurs dans les commentaires parce que quand j'ai été à essayer de comprendre ce que j'étais principalement à faire la bonne chose, mais il y avait des nuances, comme le python dict de la commande, ou le manque de celle-ci, et de la représentation json.

J'espère que ça peut aider quelqu'un, quelque part.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X