authentication - ¿Cómo verificar JWT de AWS Cognito en el backend API?
access token aws (3)
Estoy construyendo un sistema que consiste en una aplicación de una sola página de Angular2 y una API de REST que se ejecuta en ECS. La API se ejecuta en .Net / Nancy , pero eso bien podría cambiar.
Me gustaría probar Cognito y así es como me imaginé el flujo de trabajo de autenticación:
- SPA inicia sesión en usuario y recibe un JWT
- SPA envía JWT a REST API con cada solicitud
- La API REST confirma que el JWT es auténtico
Mi pregunta es sobre el paso 3. ¿Cómo puede mi servidor (o más bien: mis contenedores Docker sin estado, a escala automática, balanceados de carga) verificar que el token sea auténtico? Como el "servidor" no ha emitido el JWT en sí mismo, no puede usar su propio secreto (como se describe aquí en el ejemplo básico de JWT).
He leído los documentos de Cognito y busqué en Google, pero no encuentro ninguna buena guía sobre qué hacer con el JWT en el lado del servidor.
Aquí hay una forma 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
Resulta que no leí los documentos bien. Se explica here (desplácese hacia abajo para "Usar ID Tokens y Access Tokens en sus API web").
El servicio API puede descargar los secretos de Cognito y usarlos para verificar los JWT recibidos. Perfecto.
Editar
El comentario de @ Groady es acertado: ¿ pero cómo se validan los tokens? Diría que utilices una biblioteca probada en batalla como jose4j o nimbus (ambas Java) para eso y no implementes la verificación desde cero tú mismo.
Here una implementación de ejemplo para Spring Boot usando nimbus que me ayudó a comenzar cuando recientemente tuve que implementar esto en el servicio java / dropwizard.
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 por AWS Cognito Developer.
Al igual que muchos carteles en varios sitios, tuve problemas para unir exactamente las partes que necesito para verificar la firma de un token AWS JWT externamente, es decir, desde el lado del servidor o mediante script.
Creo que descubrí y puse una esencia para verificar una firma de token de AWS JWT . Verificará un token de AWS JWT / JWS con pyjwt o PKCS1_v1_5c desde Crypto.Signature en PyCrypto
Entonces, sí, este fue Python en mi caso, pero también es factible en el nodo (npm install jsonwebtoken jwk-to-pem request).
Intenté resaltar algunos errores en los comentarios porque cuando estaba tratando de resolver esto, estaba haciendo lo correcto, pero había algunos matices, como pitton dict ordering, o falta de, y json representación.
Con suerte, puede ayudar a alguien en alguna parte.