¿Cómo verificar JWT desde AWS Cognito en el backend de API?


Estoy construyendo un sistema que consiste en una aplicación de una sola página Angular2 y una API REST que se ejecuta en ECS. La API se ejecuta en.net/Nancy, pero eso bien podría cambiar.

Me gustaría darle una oportunidad a Cognito y así es como imaginé el flujo de trabajo de autenticación:

  1. SPA inicia sesión en el usuario y recibe un JWT
  2. SPA envía JWT a la API REST con cada solicitud
  3. La API REST verifica que el JWT es auténtico

Mi pregunta es sobre el paso 3. ¿Cómo puede mi el servidor (o más bien: mis contenedores de Docker sin estado, escalados automáticamente y con equilibrio de carga) verifica que el token es auténtico. Dado que el "servidor" no ha emitido el JWT en sí, no puede usar su propio secreto (como se describe en el ejemplo básico de JWT aquí).

He leído los documentos de Cognito y he buscado mucho en Google, pero no puedo encontrar ninguna buena guía sobre qué hacer con el JWT en el lado del servidor.

Author: EagleBeak, 2016-10-28

3 answers

Resulta que no leí bien los documentos. Se explica aquí (desplácese hacia abajo hasta "Usar tokens de ID y Tokens de acceso en sus API web").

El servicio API puede descargar los secretos de Cognito y usarlos para verificar los JWT recibidos.

Editar

El comentario de@Groady está en el punto: pero ¿cómo validas los tokens? Yo diría que use una biblioteca probada en batalla como jose4j o nimbus (ambos Java) para eso y no implemente el verificación desde cero usted mismo.

Aquí es un ejemplo de implementación para Spring Boot usando nimbus que me puso en marcha cuando recientemente tuve que implementar esto en el servicio java/dropwizard.

 22
Author: EagleBeak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-21 20:47:59

Aquí hay una manera de verificar la firma en 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 
 10
Author: FacePalm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-20 14:16:37

Tuve un problema similar pero sin usar la API Gateway. En mi caso, quería verificar la firma de un token JWT obtenido a través de la ruta de identidad autenticada de AWS Cognito Developer.

Al igual que muchos carteles en varios sitios, tuve problemas para juntar exactamente los bits que necesito para verificar la firma de un token AWS JWT externamente, es decir, del lado del servidor o a través de script

Creo que me di cuenta y puse un gist a verificar una firma de token AWS JWT. Verificará un AWS JWT / JWS token con pyjwt o PKCS1_v1_5c de Crypto.Firma en PyCrypto

Así que, sí, esto fue python en mi caso, pero también se puede hacer fácilmente en el nodo (npm install jsonwebtoken jwk-to-pem request).

Traté de resaltar algunas trampas en los comentarios porque cuando estaba tratando de averiguar esto, estaba haciendo lo correcto, pero había algunos matices como el orden de dict de Python, o la falta de, y la representación json.

Esperemos que pueda ayudar alguien en alguna parte.

 5
Author: Dave Kierans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-08 03:50:38