Wie kann ich die Signatur eines Amazon Cognito-JSON-Web-Tokens dekodieren und überprüfen?

Lesedauer: 4 Minute
0

Ich möchte einen Amazon Cognito-Benutzerpool als Authentifizierungsmethode für meine Anwendung verwenden. Was ist eine sichere Methode, um die ID und die Zugriffstoken zu überprüfen, die von Clients an meine Anwendung gesendet wurden?

Kurzbeschreibung

Wenn sich Clients mit einem Benutzerpool bei Ihrer Anwendung authentifizieren, sendet Amazon Cognito ein ID-Token. Sie können das ID-Token in ähnlichen Szenarien wie den folgenden manuell überprüfen:

  • Sie haben eine Webanwendung erstellt und möchten einen Amazon Cognito-Benutzerpool für die Authentifizierung verwenden.
  • Sie verwenden einen Amazon Cognito-Benutzerpool für die Authentifizierung und einen Amazon Cognito-Identitätspool, um temporäre Anmeldeinformationen für AWS Security Token Service (AWS STS) abzurufen. Mit diesen Anmeldeinformationen wird AWS Lambda aufgerufen, Lambda hat jedoch keine Informationen darüber, wer sich ursprünglich beim Benutzerpool authentifiziert hat.

Um Amazon Cognito-Benutzerdetails in einem Amazon Cognito JSON Web Token (JWT) abzurufen, können Sie das Token dekodieren und dann die Signatur überprüfen.

Auflösung

AWS hat die folgende Bibliothek veröffentlicht, mit der Sie JWTs überprüfen können: 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!");
}

Nachdem sich ein Benutzer angemeldet hat, gibt ein Amazon Cognito-Benutzerpool ein JWT zurück. Das JWT ist eine base64-URL-kodierte JSON-Zeichenfolge („Claims“), die Informationen über den Benutzer enthält. Amazon Cognito gibt drei Token zurück: das ID-Token, das Zugriffstoken und das Aktualisierungstoken. Das ID-Token enthält die Benutzerfelder, die im Amazon Cognito-Benutzerpool definiert sind.

Tokens bestehen aus drei Abschnitten: einem Header, einer Payload und einer Signatur.

Im Folgenden finden Sie den Header eines Beispiel-ID-Tokens. Der Header enthält die Schlüssel-ID („kid“) sowie den Algorithmus („alg“), der zum Signieren des Tokens verwendet wird. In diesem Beispiel lautet der Algorithmus „RS256", was eine RSA-Signatur mit SHA-256 ist.

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

Im Folgenden finden Sie ein Beispiel für die Payload, die Informationen über den Benutzer sowie Zeitstempel für die Erstellung und den Ablauf des Tokens enthält:

{
  "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"
}

Der letzte Abschnitt ist die Signatur, bei der es sich um eine gehashte und verschlüsselte Kombination aus Header und Payload handelt.

Amazon Cognito generiert zwei RSA-Schlüsselpaare für jeden Benutzerpool. Der private Schlüssel jedes Paares wird verwendet, um das jeweilige ID-Token oder Zugriffstoken zu signieren. Die öffentlichen Schlüssel werden an einer Adresse im folgenden Format zur Verfügung gestellt:

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

Die JSON-Datei (jwks.json) ist im folgenden Format strukturiert:

{
    "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"
    }]
}

Um die Signatur eines Amazon Cognito JWT zu überprüfen, suchen Sie zunächst nach dem öffentlichen Schlüssel mit einer Schlüssel-ID, die mit der Schlüssel-ID im Header des Tokens übereinstimmt. Anschließend können Sie Bibliotheken wie aws-jwt-verify oder die von jwt.io oder OpenID Foundation empfohlenen Bibliotheken verwenden, um die Signatur des Tokens zu validieren und Werte wie Ablaufdatum und Benutzername zu extrahieren.

Neben der Signatur empfiehlt es sich auch, Folgendes zu überprüfen:

  • Das Token ist nicht abgelaufen.
  • Die in der Payload angegebene Zielgruppe („aud“) entspricht der App-Client-ID, die im Amazon Cognito-Benutzerpool erstellt wurde.

Die aws-jwt-verify-Bibliothek umfasst diese Prüfungen in Ihrem Namen. Weitere Codebeispiele zum Dekodieren und Überprüfen eines Amazon Cognito JWT mithilfe von Lambda finden Sie unter Dekodieren und Überprüfen von Amazon Cognito JWT-Token.


Verwandte Informationen

Überprüfen eines JSON Web Tokens

Verwenden von Tokens mit Benutzerpools

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren