Steuern des Zugriffs auf HTTP-APIs mit JWT-Genehmigern
Sie können JSON Web Tokens (JWTs) als Teil der Frameworks OpenID Connect (OIDC)
Wenn Sie einen JWT-Genehmiger für eine Route Ihrer API konfigurieren, validiert API Gateway die JWTs, die Clients mit API-Anfragen übermitteln. API Gateway genehmigt oder lehnt Anfragen basierend auf der Token-Validierung und optional Bereichen im Token ab. Wenn Sie Bereiche für eine Route konfigurieren, muss das Token mindestens einen der Bereiche der Route enthalten.
Sie können unterschiedliche Genehmiger für jede Route einer API konfigurieren oder denselben Genehmiger für mehrere Routen verwenden.
Es gibt keinen Standardmechanismus, um JWT-Zugriffstoken von anderen Arten von JWTs wie beispielsweise OpenID Connect ID-Token zu unterscheiden. Wir empfehlen, Ihre Routen so zu konfigurieren, dass Autorisierungsbereiche erforderlich sind, es sei denn, Sie benötigen ID-Token für die API-Autorisierung Sie können Ihre JWT-Genehmiger auch so konfigurieren, dass Aussteller oder Zielgruppen erforderlich sind, die Ihr Identitätsanbieter nur bei der Ausgabe von JWT-Zugriffstoken verwendet.
Autorisieren von API-Anfragen
API Gateway verwendet den folgenden allgemeinen Workflow, um Anfragen an Routen zu autorisieren, die für die Verwendung eines JWT-Genehmigers konfiguriert sind.
-
Überprüfen Sie die
identitySource
auf ein Token. DeridentitySource
kann nur das Token oder das Token mit dem PräfixBearer
enthalten. -
Decodieren Sie das Token.
-
Überprüfen Sie den Algorithmus und die Signatur des Tokens mit dem vom des Ausstellers abgerufenen öffentlichen Schlüsse
jwks_uri
. Derzeit werden nur RSA-basierte Algorithmen unterstützt. -
Validieren Sie die Ansprüche. API Gateway evaluiert die folgenden Token-Ansprüche:
-
kid
– Das Token muss einen Header-Anspruch haben, der mit dem Schlüssel in dem jwks_uri
übereinstimmt, der das Token signiert hat. -
iss
– Muss mit dem für den Genehmiger konfigurierten issuer
übereinstimmen. -
aud
oder client_id
– Muss mit einem der für den Genehmiger konfiguriertenaudience
-Einträge übereinstimmen. -
exp
– Muss nach der aktuellen Uhrzeit in UTC liegen. -
nbf
– Muss vor der aktuellen Uhrzeit in UTC liegen. -
iat
– Muss vor der aktuellen Uhrzeit in UTC liegen. -
scope
oder scp
– Das Token muss mindestens einen der Bereiche in denauthorizationScopes
der Route enthalten.
-
Wenn einer dieser Schritte fehlschlägt, lehnt API Gateway die API-Anfrage ab.
Nach der Validierung des JWT übergibt API Gateway die Ansprüche im Token an die Integration der API-Route. Backend-Ressourcen, wie beispielsweise Lambda-Funktionen, können auf die JWT-Ansprüche zugreifen. Wenn das JWT beispielsweise den Identitätsanspruch emailID
enthält, ist er für eine Lambda-Integration in $event.requestContext.authorizer.jwt.claims.emailID
verfügbar. Weitere Informationen zur Nutzlast, die API Gateway an Lambda-Integrationen sendet, finden Sie unter Arbeiten mit AWS Lambda-Proxy-Integrationen für HTTP-APIs.
Erstellen eines JWT-Genehmigers
Bevor Sie einen JWT-Genehmiger erstellen, müssen Sie eine Clientanwendung bei einem Identitätsanbieter registrieren. Sie müssen darüber hinaus eine HTTP-API erstellt haben. Beispiele zum Erstellen einer HTTP-API finden Sie unter Erstellen einer HTTP-API. Eine AWS CloudFormation-Beispielvorlage, mit der eine HTTP-API mit einem JWT-Genehmiger erstellt wird, der Amazon Cognito als Identitätsanbieter verwendet, finden Sie unter http-with-jwt-auth.yaml
Mit dem folgenden AWS CLI-Befehl wird ein JWT-Genehmiger. Bei jwt-configuration
geben Sie das Audience
und Issuer
als Ihren Identitätsanbieter an.
aws apigatewayv2 create-authorizer \ --name
authorizer-name
\ --api-idapi-id
\ --authorizer-type JWT \ --identity-source '$request.header.Authorization
' \ --jwt-configuration Audience=audience
,Issuer=https://cognito-idp.us-east-2
.amazonaws.com/userPoolID
Aktualisieren einer Route zum Verwenden eines JWT-Genehmigers mithilfe der AWS CLI
Mit dem folgenden Befehl wird eine Route so aktualisiert, dass sie einen JWT-Genehmiger verwendet.
aws apigatewayv2 update-route \ --api-id
api-id
\ --route-idroute-id
\ --authorization-type JWT \ --authorizer-idauthorizer-id
\ --authorization-scopesuser.email