Come posso decodificare e verificare la firma di un token Web JSON di Amazon Cognito?

4 minuti di lettura
0

Desidero utilizzare un pool di utenti Amazon Cognito come metodo di autenticazione per la mia applicazione. Qual è un modo sicuro per verificare l'ID e i token di accesso inviati dai clienti alla mia applicazione?

Breve descrizione

Quando i client eseguono l'autenticazione sulla tua applicazione con un pool di utenti, Amazon Cognito invia un token ID. Puoi verificare manualmente il token ID in scenari simili ai seguenti:

  • Hai creato un'applicazione Web e desideri utilizzare un pool di utenti Amazon Cognito per l'autenticazione.
  • Utilizzi un pool di utenti Amazon Cognito per l'autenticazione e un pool di identità Amazon Cognito per recuperare le credenziali temporanee di AWS Security Token Service (AWS STS). AWS Lambda viene richiamato con tali credenziali, ma Lambda non dispone di informazioni su chi si è autenticato originariamente con il pool di utenti.

Per ottenere i dettagli utente di Amazon Cognito contenuti in un Amazon Cognito JSON Web Token (JWT), puoi decodificare il token e quindi verificare la firma.

Risoluzione

AWS ha rilasciato la seguente libreria che puoi utilizzare per verificare i JWT: https://github.com/awslabs/aws-jwt-verify

import { CognitoJwtVerifier } from "aws-jwt-verify";

// Verifier that expects valid access tokens:
const verifier = CognitoJwtVerifier.create({
  userPoolId: "<user_pool_id>",
  tokenUse: "access",
  clientId: "<client_id>",
});

try {
  const payload = await verifier.verify(
    "eyJraWQeyJhdF9oYXNoIjoidk..." // the JWT as string
  );
  console.log("Token is valid. Payload:", payload);
} catch {
  console.log("Token not valid!");
}

Dopo l'accesso di un utente, un pool di utenti Amazon Cognito restituisce un JWT. Il JWT è una stringa JSON codificata in base64url (“claims”) che contiene informazioni sull'utente. Amazon Cognito restituisce tre token: il token ID, il token di accesso e il token di aggiornamento. Il token ID contiene i campi utente definiti nel pool di utenti di Amazon Cognito.

I token includono tre sezioni: un'intestazione, un payload e una firma.

Di seguito è riportata l'intestazione di un token ID di esempio. L'intestazione contiene l'ID chiave (“kid”) e l'algoritmo (“alg”) utilizzato per firmare il token. In questo esempio, l'algoritmo è «RS256", che è una firma RSA con SHA-256.

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

Di seguito è riportato un esempio del payload, che contiene informazioni sull'utente e i timestamp della creazione e della scadenza del token:

{
  "sub": "aaaaaaaa-bbbb-cccc-dddd-example",
  "aud": "xxxxxxxxxxxxexample",
  "email_verified": true,
  "token_use": "id",
  "auth_time": 1500009400,
  "iss": "https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-2_example",
  "cognito:username": "anaya",
  "exp": 1500013000,
  "given_name": "Anaya",
  "iat": 1500009400,
  "email": "anaya@example.com"
}

L'ultima sezione è la firma, che è una combinazione crittografata e crittografata dell'intestazione e del payload.

Amazon Cognito genera due coppie di chiavi RSA per ogni pool di utenti. La chiave privata di ogni coppia viene utilizzata per firmare il rispettivo token ID o token di accesso. Le chiavi pubbliche sono rese disponibili a un indirizzo nel seguente formato:

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json

Il file JSON (jwks.json) è strutturato nel seguente formato:

{
    "keys": [{
        "alg": "RS256",
        "e": "AQAB",
        "kid": "abcdefghijklmnopqrsexample=",
        "kty": "RSA",
        "n": "lsjhglskjhgslkjgh43lj5h34lkjh34lkjht3example",
        "use": "sig"
    }, {
        "alg":
        "RS256",
        "e": "AQAB",
        "kid": "fgjhlkhjlkhexample=",
        "kty": "RSA",
        "n": "sgjhlk6jp98ugp98up34hpexample",
        "use": "sig"
    }]
}

Per verificare la firma di un JWT di Amazon Cognito, cerca innanzitutto la chiave pubblica con un ID chiave che corrisponda all'ID chiave nell'intestazione del token. Quindi, puoi utilizzare le librerie, come aws-jwt-verify o quelle consigliate da jwt.io o OpenID Foundation, per convalidare la firma del token ed estrarre valori, come scadenza e nome utente.

Oltre alla firma, è consigliabile verificare quanto segue:

  • Il token non è scaduto.
  • Il pubblico (“aud”) specificato nel payload corrisponde all'ID client dell'app creato nel pool di utenti di Amazon Cognito.

La libreria aws-jwt-verify include questi controlli per tuo conto. Per altri esempi di codice su come decodificare e verificare un Amazon Cognito JWT utilizzando Lambda, consulta Decodificare e verificare i token JWT di Amazon Cognito.


Informazioni correlate

Verifica di un token Web JSON

Utilizzo di token con pool di utenti

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa