Überprüfen 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.

Überprüfen eines JSON Web-Tokens

JSONWeb-Token (JWTs) können einfach dekodiert, gelesen und geändert werden. Ein modifiziertes Zugriffstoken birgt das Risiko einer Rechteeskalation. Ein modifiziertes ID-Token birgt das Risiko eines Identitätswechsels. Ihre Anwendung vertraut Ihrem Benutzerpool als Token-Aussteller, aber was ist, wenn ein Benutzer das Token während der Übertragung abfängt? Sie müssen sicherstellen, dass Ihre Anwendung dasselbe Token erhält, das Amazon Cognito ausgestellt hat.

Amazon Cognito gibt Token aus, die einige der Integritäts- und Vertraulichkeitsfunktionen der OpenID Connect (OIDC) -Spezifikation verwenden. Benutzerpool-Token geben anhand von Objekten wie der Ablaufzeit, dem Aussteller und der digitalen Signatur die Gültigkeit an. Die Signatur, das dritte und letzte Segment des durch . -getrennten BereichsJWT, ist die Schlüsselkomponente der Token-Validierung. Ein böswilliger Benutzer kann ein Token ändern, aber wenn Ihre Anwendung den öffentlichen Schlüssel abruft und die Signatur vergleicht, stimmt sie nicht überein. Jede Anwendung, die über die OIDC Authentifizierung verarbeitet JWTs wird, muss diesen Überprüfungsvorgang bei jeder Anmeldung durchführen.

Auf dieser Seite geben wir einige allgemeine und spezifische Empfehlungen zur Überprüfung vonJWTs. Die Anwendungsentwicklung umfasst eine Vielzahl von Programmiersprachen und Plattformen. Da die Implementierung von Amazon Cognito der öffentlichen Spezifikation OIDC ausreichend nahe kommt, kann jede seriöse JWT Bibliothek in der Entwicklungsumgebung Ihrer Wahl Ihre Überprüfungsanforderungen erfüllen.

Diese Schritte beschreiben die Überprüfung eines JSON Web-Tokens () JWT für einen Benutzerpool.

Voraussetzungen

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

Weitere Informationen finden Sie auf den folgenden Seiten.

Für die Dekodierung und Überprüfung eines JSON Web-Tokens () stehen viele Bibliotheken zur Verfügung. JWT Wenn Sie Token für die serverseitige API Verarbeitung manuell verarbeiten möchten oder wenn Sie andere Programmiersprachen verwenden, können diese Bibliotheken helfen. Informationen zur Arbeit mit JWT Tokens finden Sie in der OpenID Foundation-Bibliotheksliste.

Bestätigen Sie Tokens mit aws-jwt-verify

Empfiehlt in einer Node.js -App die AWS aws-jwt-verify Bibliothek zur Überprüfung der Parameter in dem Token, 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 unter aws-jwt-verifynein GitHub.

Tokens verstehen und überprüfen

Bevor Sie die Tokeninspektion in Ihre App integrieren, sollten Sie sich überlegen, wie Amazon Cognito zusammenbautJWTs. 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 Verfahren zur manuellen Überprüfung von Amazon Cognito JWTs beschrieben, während Sie Ihre App vorbereiten.

Bestätigen Sie die Struktur des JWT

Ein JSON Web-Token (JWT) umfasst drei Abschnitte mit einem . (Punkt-) Trennzeichen dazwischen.

Header

Die Schlüssel-ID und der RSA Algorithmus kidalg, mit denen Amazon Cognito das Token signiert hat. Amazon Cognito signiert Tokens mit einem alg von RS256. Das kid ist ein gekürzter Verweis auf einen RSA privaten 2048-Bit-Signaturschlüssel, der sich in Ihrem Benutzerpool befindet.

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 RSA256 um eine Kennung, die aus einem Signaturschlüssel und Parametern abgeleitet wird und die Sie an Ihrem Computer beobachten können. JWKS URI

Der Header und die Payload sind Base64-codiertJSON. 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 Token präsentiert und es nicht im Format ist[JSON Header].[JSON Payload].[Signature], ist es kein gültiges Amazon Cognito Cognito-Token und Sie können es verwerfen.

Bestätigen Sie das JWT

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

Um die Signatur eines Tokens zu überprüfen JWT
  1. Dekodieren Sie das ID-Token.

    Die OpenID Foundation führt auch eine Liste von Bibliotheken für die Arbeit mit JWT Tokens.

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

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

    1. Laden Sie den entsprechenden öffentlichen JSON Webschlüssel (JWK) für Ihren Benutzerpool herunter und speichern Sie ihn. Er ist als Teil eines JSON Web Key Sets (JWKS) verfügbar. Sie können es finden, indem Sie Folgendes jwks_uri URI für Ihre Umgebung erstellen:

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

      Weitere Informationen zu JWK und JWK Sets finden Sie unter JSONWeb 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)

      Dies kid ist ein Hinweis, der angibt, 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 RS256 kryptografischen Algorithmus, bei dem es sich um eine RSA Signatur mit SHA -256 handelt. Weitere Informationen dazu finden Sie unter RSA RSA Kryptografie.

      Schlüsseltyp (kty)

      Der kty Parameter identifiziert die kryptografische Algorithmusfamilie, die mit dem Schlüssel verwendet wird, z. B. "RSA" in diesem Beispiel.

      RSAExponent () e

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

      RSAModul () n

      Der n Parameter enthält den Modulwert für den RSA öffentlichen Schlüssel. Er wird als urlUInt Base64-codierter 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. Suchen Sie im öffentlichen JSON Webschlüssel nach einemkid, der kid Ihrem entspricht. JWT

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

    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

Um JWT Ansprüche zu überprüfen
  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 ein API Like GetUser. APIAnfragen, die Sie mit einem Zugriffstoken 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 das Zugriffstoken nur in Ihren API Weboperationen akzeptieren, muss sein access Wert

    • 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.