Nuestros mejores desarrolladores agotaron sus provisiones de café, por su búsqueda todo el tiempo por la resolución, hasta que Natalia encontró la contestación en GitHub por lo tanto ahora la comparte con nosotros.
Resulta que no leí bien los documentos. Se explica aquí (desplácese hacia abajo hasta “Uso de tokens de identificación y tokens de acceso 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 ¿Validas los tokens? Yo diría que use una biblioteca probada en batalla como jose4j o nimbus (ambos Java) para eso y no implemente la verificación desde cero usted mismo.
Aquí hay 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.
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
Ejecutar un flujo de concesión de código de autorización
Suponiendo que usted:
- haya configurado correctamente un grupo de usuarios en AWS Cognito, y
-
pueden registrarse / iniciar sesión y obtener un código de acceso a través de:
https://
.auth.us-west-2.amazoncognito.com/login?response_type=code&client_id= &redirect_uri=
Su navegador debería redirigir a
Ahora debe pasar ese código a su back-end y hacer que solicite un token por usted.
POST https://
- establecer su
Authorization
encabezado aBasic
y useusername=
ypassword=
según su cliente de aplicación configurado en AWS Cognito - establezca lo siguiente en el cuerpo de su solicitud:
grant_type=authorization_code
code=
client_id=
redirect_uri=
Si tiene éxito, su back-end debería recibir un conjunto de tokens codificados en base64.
id_token: '...',
access_token: '...',
refresh_token: '...',
expires_in: 3600,
token_type: 'Bearer'
Ahora, de acuerdo con la documentación, su back-end debe validar la firma JWT mediante:
- Decodificando el token de identificación
- Comparando lo local key ID (niño) al niño público
- Usando el publico key para verificar la firma usando su biblioteca JWT.
Dado que AWS Cognito genera dos pares de criptografía RSA keys para cada grupo de usuarios, debe averiguar qué key se utilizó para cifrar el token.
Aquí está un NodeJS fragmento que demuestra la verificación de un JWT.
import jsonwebtoken from 'jsonwebtoken'
import jwkToPem from 'jwk-to-pem'
const jsonWebKeys = [ // from https://cognito-idp.us-west-2.amazonaws.com//.well-known/jwks.json
"alg": "RS256",
"e": "AQAB",
"kid": "ABCDEFGHIJKLMNOPabc/1A2B3CZ5x6y7MA56Cy+6ubf=",
"kty": "RSA",
"n": "...",
"use": "sig"
,
"alg": "RS256",
"e": "AQAB",
"kid": "XYZAAAAAAAAAAAAAAA/1A2B3CZ5x6y7MA56Cy+6abc=",
"kty": "RSA",
"n": "...",
"use": "sig"
]
function validateToken(token)
const header = decodeTokenHeader(token); // "kid":"XYZAAAAAAAAAAAAAAA/1A2B3CZ5x6y7MA56Cy+6abc=", "alg": "RS256"
const jsonWebKey = getJsonWebKeyWithKID(header.kid);
verifyJsonWebTokenSignature(token, jsonWebKey, (err, decodedToken) =>
if (err)
console.error(err);
else
console.log(decodedToken);
)
function decodeTokenHeader(token)
const [headerEncoded] = token.split('.');
const buff = new Buffer(headerEncoded, 'base64');
const text = buff.toString('ascii');
return JSON.parse(text);
function getJsonWebKeyWithKID(kid)
for (let jwk of jsonWebKeys)
if (jwk.kid === kid)
return jwk;
return null
function verifyJsonWebTokenSignature(token, jsonWebKey, clbk)
const pem = jwkToPem(jsonWebKey);
jsonwebtoken.verify(token, pem, algorithms: ['RS256'], (err, decodedToken) => clbk(err, decodedToken))
validateToken('xxxxxxxxx.XXXXXXXX.xxxxxxxx')
Si posees algún reparo o disposición de medrar nuestro crónica eres capaz de ejecutar una referencia y con gusto lo observaremos.