Verifizieren eines JSON-Web-Tokens - Amazon Cognito

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verifizieren eines JSON-Web-Tokens

Diese Schritte beschreiben die Verifizierung eines Benutzerpool-JSON-Web-Tokens (JWT).

Voraussetzungen

Ihre Bibliothek, Ihr SDK oder Ihr Software-Framework erledigt möglicherweise bereits Aufgaben in diesem Abschnitt. AWS SDKs bieten Tools für die Handhabung und Verwaltung von Amazon Cognito Cognito-Benutzerpool-Tokens in Ihrer App. AWS Amplify beinhaltet Funktionen zum Abrufen und Aktualisieren von Amazon Cognito Cognito-Token.

Weitere Informationen finden Sie auf den folgenden Seiten.

Viele Bibliotheken sind zum Decodieren und Verifizieren eines JSON Web Token (JWT) verfügbar. Wenn Sie Tokens für die serverseitige API-Verarbeitung manuell verarbeiten müssen, oder wenn Sie andere Programmiersprachen verwenden, können diese Bibliotheken hilfreich sein. Weitere Informationen finden Sie in der Liste der OpenID Foundation mit Bibliotheken für die Arbeit mit JWT-Token.

Bestätigen Sie Token mit aws-jwt-verify

AWS Empfiehlt der aws-jwt-verifyBibliothek in einer App von Node.js, die Parameter im Token zu validieren, das Ihr Benutzer an Ihre App übergibt. Mit aws-jwt-verify können Sie einen CognitoJwtVerifier mit den Anspruchswerten auffüllen, die Sie für einen oder mehrere Benutzerpools überprüfen möchten. Zu den Werten, die überprüft werden können, gehören, dass

Weitere Informationen und Beispielcode, den Sie in einer Node.js -App oder einem AWS Lambda Authorizer verwenden können, finden Sie aws-jwt-verifyunter GitHub.

Tokens verstehen und überprüfen

Bevor Sie die Token-Inspektion in Ihre App integrieren, sollten Sie sich überlegen, wie Amazon Cognito JWTs zusammenstellt. Rufen Sie Beispiel-Tokens aus Ihrem Benutzerpool ab. Dekodieren und untersuchen Sie diese im Detail, um ihre Eigenschaften zu verstehen, und legen Sie fest, was Sie wann überprüfen möchten. So können Sie beispielsweise in einem Szenario die Gruppenmitgliedschaft und in einem anderen Bereiche überprüfen.

In den folgenden Abschnitten wird ein Prozess beschrieben, mit dem Sie Amazon Cognito JWTs bei der Vorbereitung Ihrer App manuell überprüfen können.

Bestätigen der Struktur des JWT

Ein JSON-Web-Token (JWT) enthält drei Abschnitte mit einem . (Punkt)-Zeichen dazwischen.

Header

Die Schlüssel-ID, kid, und der RSA-Algorithmus, alg, mit denen Amazon Cognito das Token signiert hat. Amazon Cognito signiert Tokens mit einem alg von RS256. Dabei kid handelt es sich um einen gekürzten Verweis auf einen privaten 2048-Bit-RSA-Signaturschlüssel, der in Ihrem Benutzerpool gespeichert ist.

Nutzlast

Token-Ansprüche. In einem ID-Token enthalten die Ansprüche Benutzerattribute und Informationen über den Benutzerpool, iss, und den App-Client, aud. In einem Zugriffstoken umfasst die Payload Bereiche, Gruppenmitgliedschaft, Ihren Benutzerpool als iss und Ihren App-Client als client_id.

Signatur

Die Signatur ist nicht base64-dekodierbar wie der Header und die Payload. Es handelt sich um eine RSA256-ID, die aus einem Signaturschlüssel und Parametern abgeleitet ist, die Sie auf Ihrer JWKS-URI sehen können.

Der Header und die Payload sind base64-kodiertes JSON. Sie können sie anhand der Zeichen eyJ am Anfang erkennen, die zum Startzeichen { dekodiert werden. Wenn Ihr Benutzer Ihrer App ein base64-kodiertes JWT präsentiert und dies nicht das Format [JSON Header].[JSON Payload].[Signature] hat, ist es kein gültiges Amazon-Cognito-Token und Sie können es verwerfen.

Überprüfen des JWT

Die JWT-Signatur ist eine gehashte Kombination aus Header und Nutzlast. Amazon Cognito generiert zwei Paare RSA-Kryptoschlüssel für jeden Benutzerpool. Ein privater Schlüssel signiert Zugriffstokens und der andere signiert ID-Tokens.

Verifizieren der Signatur eines JWT-Tokens
  1. Dekodieren Sie das ID-Token.

    Die OpenID Foundation pflegt auch eine Liste mit Bibliotheken für die Arbeit mit JWT-Token.

    Sie können ihn auch AWS Lambda zum Dekodieren von Benutzerpool-JWTs verwenden. Weitere Informationen finden Sie unter Amazon Cognito JWT-Token dekodieren und verifizieren mithilfe von. AWS Lambda

  2. Vergleichen Sie die lokale Schlüssel-ID (kid) mit der öffentlichen kid.

    1. Laden Sie den entsprechenden JWK (JSON Web Key) für Ihren Benutzerpool herunter und speichern Sie ihn. Er ist als Teil eines JWKS (JSON Web Key Set) verfügbar. Sie können ihn finden, indem Sie die folgende jwks_uri-URI für Ihre Umgebung konstruieren:

      https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json

      Weitere Informationen zu JWK- und JWK-Sets finden Sie unter JSON Web Key (JWK).

      Anmerkung

      Amazon Cognito rotiert möglicherweise die Signaturschlüssel in Ihrem Benutzerpool. Es hat sich bewährt, öffentliche Schlüssel in Ihrer App zwischenzuspeichern, indem Sie kid als Cache-Schlüssel verwenden und den Cache regelmäßig aktualisieren. Vergleichen Sie die kid in den Tokens, die Ihre App erhält, mit Ihrem Cache.

      Wenn Sie ein Token mit dem korrekten Aussteller, aber einer anderen kid erhalten, hat Amazon Cognito möglicherweise den Signaturschlüssel rotiert. Aktualisieren Sie den Cache von Ihrem Benutzerpool–jwks_uri-Endpunkt aus.

      Dies ist eine jwks.json-Beispieldatei:

      { "keys": [{ "kid": "1234example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "1234567890", "use": "sig" }, { "kid": "5678example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "987654321", "use": "sig" }] }
      Schlüssel-ID (kid)

      Der kid-Parameter ist ein Hinweis darauf, welcher Schlüssel verwendet wurde, um die JSON-Websignatur (JWS) des Tokens zu sichern.

      Algorithmus (alg)

      Der alg-Header-Parameter stellt den kryptografischen Algorithmus dar, mit dem das ID-Token gesichert wird. Benutzerpools verwenden einen kryptografischen RS256-Algorithmus, eine RSA-Signatur mit SHA-256. Weitere Informationen zu RSA finden Sie unter RSA-Kryptografie.

      Schlüsseltyp (kty)

      Der kty-Parameter identifiziert die kryptografischen Algorithmus-Familie, die mit dem Schlüssel verwendet wird, z. B. „RSA“ in diesem Beispiel.

      RSA-Exponent (e)

      Der e-Parameter enthält den Exponentenwert für den öffentlichen RSA-Schlüssel. Er wird als Base64urlUInt-kodierten Wert dargestellt.

      RSA-Modulo (n)

      Der n-Parameter enthält den Modulo-Wert für den öffentlichen RSA-Schlüssel. Er wird als Base64urlUInt-kodierten Wert dargestellt.

      Verwenden von (use)

      Der use-Parameter beschreibt die beabsichtigte Verwendung des öffentlichen Schlüssels. In diesem Beispiel stellt der use-Wert sig die Signatur dar.

    2. Durchsuchen Sie den öffentlichen JSON-Web-Schlüssel nach einer kid die mit der kid Ihres JWT übereinstimmt.

  3. Verwenden Sie eine JWT-Bibliothek, um die Signatur des Ausstellers mit der Signatur im Token zu vergleichen. Die Signatur des Emittenten leitet sich aus dem öffentlichen Schlüssel (den RSA-Modulen "n") des kid in jwks.json ab, der mit dem Token kid übereinstimmt. Möglicherweise müssen Sie den JWK zuerst in das PEM-Format konvertieren. Das folgende Beispiel benutzt das JWT und das JWK und verwendet die Node.js-Bibliothek, jsonwebtoken, um die JWT-Signatur zu überprüfen:

    Node.js
    var jwt = require('jsonwebtoken'); var jwkToPem = require('jwk-to-pem'); var pem = jwkToPem(jwk); jwt.verify(token, pem, { algorithms: ['RS256'] }, function(err, decodedToken) { });

Überprüfen der Ansprüche

Überprüfen der JWT-Ansprüche
  1. Stellen Sie mit einer der folgenden Methoden sicher, dass das Token nicht abgelaufen ist.

    1. Dekodieren Sie das Token und vergleichen Sie den exp-Anspruch mit der aktuellen Uhrzeit.

    2. Wenn Ihr Zugriffstoken einen aws.cognito.signin.user.admin Anspruch enthält, senden Sie eine Anfrage an eine API wie. GetUser API-Anfragen, die Sie mit einem Zugriffs-Token autorisieren, geben einen Fehler zurück, wenn Ihr Token abgelaufen ist.

    3. Präsentieren Sie Ihr Zugriffs-Token in einer Anfrage an den UserInfo-Endpunkt. Ihre Anfrage gibt einen Fehler zurück, wenn Ihr Token abgelaufen ist.

  2. Der aud-Anspruch in einem ID-Token und der client_id-Anspruch in einem Zugriffstoken müssen mit der App-Client-ID übereinstimmen, die im Amazon-Cognito-Benutzerpool erstellt wurde.

  3. Der Aussteller (iss)-Anspruch muss mit Ihrem Benutzerpool übereinstimmen. Ein in der us-east-1-Region erstellter Benutzerpool hat den folgenden iss-Wert:

    https://cognito-idp.us-east-1.amazonaws.com/<userpoolID>.

  4. Prüfen Sie den token_use-Anspruch.

    • Wenn Sie nur das Zugriffstoken in den Web-API-Operationen akzeptieren, muss der Wert lauten access.

    • Verwenden Sie nur das ID-Token, muss der Wert sein id.

    • Wenn Sie ID- und Zugriffstoken verwenden, muss der token_use-Anspruch id oder access sein.

Jetzt können Sie den Ansprüchen innerhalb des Tokens vertrauen.