Saltar al contenido

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

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 ?code=4dd94e4f-3323-471e-af0f-dc52a8fe98a0


Ahora debe pasar ese código a su back-end y hacer que solicite un token por usted.

POST https://.auth.us-west-2.amazoncognito.com/oauth2/token

  • establecer su Authorization encabezado a Basic y use username= y password= 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:

  1. Decodificando el token de identificación
  2. Comparando lo local key ID (niño) al niño público
  3. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *