Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Wie behebe ich „Unauthorized“ -Fehler bei der Ausführung von GraphQL-Anfragen in AWS AppSync?
Wenn ich GraphQL-Anfragen mit AWS AppSync ausführe, erhalte ich die Fehlermeldung „Unauthorized“.
Kurzbeschreibung
Es gibt zwei Arten von „Unauthorized“ -Fehler, die durch den HTTP-Statuscode definiert werden, der in der Antwort zurückgegeben wird:
- 401 Unauthorized: Die Anforderung wird entweder von AWS AppSync oder vom Autorisierungsmodus abgelehnt, da die Anmeldeinformationen fehlen oder nicht gültig sind.
- 200 OK-Antwort mit einem Fehler vom Typ Unauthorized: Die Anforderung wird aufgrund eines Problems auf oder außerhalb der Resolver-Ebene abgelehnt.
Versuche, das Problem in einem Webbrowser zu reproduzieren, um die Ursache des „Unauthorized“ -Fehlers zu ermitteln. Verwende dann die Netzwerktools des Browsers, um die HTTP-Anforderung und die Antwortnachrichten zu erfassen. Analysiere die Meldungen, um festzustellen, wo der Fehler aufgetreten ist. Um ihn offline zu analysieren, speichere die Nachrichten in einer HTTP-Archiv (HAR)-Datei.
Lösung
401 Unauthorized response
Überprüfe bei einer 401 Unauthorized-Antwort die Netzwerkanforderung, die die GraphQL-Nutzdaten sendet, um Folgendes zu bestätigen:
- Der Header Autorisierung oder x-api-key ist vorhanden und enthält die richtigen Anmeldeinformationen für den Autorisierungsmodus, den die Operation oder das Feld benötigt. Wenn der Header nicht die richtigen Anmeldeinformationen hat, lehnt der Autorisierungsmodus die Anforderung ab.
- Weitere Informationen zu JSON Web Tokens (JWT) findest du unter Authorization header doesn't include the text "Bearer" (Autorisierungs-Header enthält nicht den Text „Bearer“) auf der GitHub-Website.
- Das JWT stammt aus dem richtigen Amazon Cognito-Benutzerpool oder vom OpenID Connect (OIDC)-Anbieter.
- Die Anmeldeinformationen sind gültig und nicht abgelaufen.
200 OK-Antwort
Um weitere Informationen darüber zu erhalten, was Unauthorized-Fehler bei einer 200 OK-Antwort verursacht, aktiviere Amazon CloudWatch-Protokolle in der AWS AppSync-API. Es hat sich bewährt, die Protokollierung auf Feldebene auf Alle zu setzen und ausführliche Inhalte einzubeziehen.
Anforderungen, die eine 200 OK-Antwort mit dem Fehlertyp Unauthorized und der Meldung Not Authorized to access X on type Y erhalten, werden von der Logik in den Resolver-Zuweisungsvorlagen der Apache Velocity Template Language (VTL) abgelehnt. Um dieses Problem zu beheben, führe die folgenden Schritte zur Problembehandlung für den von dir verwendeten Autorisierungsmodus aus.
Amazon Cognito und OIDC-Autorisierung
Vergleiche die Token-Ansprüche des Benutzers, wie Gruppen, email_verified und Client-ID oder Zielgruppe, mit den Autorisierungsprüfungen in den VTL-Resolver-Zuweisungsvorlagen. Du kannst das Drittanbieter-Tool jwt.io auf der AuthO-Website verwenden, um die Token-Ansprüche zu überprüfen. Wenn du AWS Amplify verwendest, stelle sicher, dass die Token-Ansprüche die Anforderungen der Autorisierungsregeln für den Modellschematyp unterstützen. Die folgende Resolver-Zuweisungsvorlage für Amplify überprüft beispielsweise die Daten, die bei der vorläufigen Autorisierungsprüfung von AWS AppSync erfolgreich waren.
#if( $util.authType() == "User Pool Authorization" ) #if( !$isAuthorized ) #set( $staticGroupRoles = [{"claim":"cognito:groups","entity":"Admin","allowedFields":xxxxx,yyyyy}] ) #foreach( $groupRole in $staticGroupRoles ) #set( $groupsInToken = $util.defaultIfNull($ctx.identity.claims.get($groupRole.claim), []) ) #if( $groupsInToken.contains($groupRole.entity) ) #if( $groupRole.isAuthorizedOnAllFields ) #set( $isAuthorized = true ) #break #else $util.qr($allowedFields.addAll($groupRole.allowedFields)) #end #end #end #end #end
Wenn du Amplify verwendest, stelle außerdem sicher, dass die Autorisierungsregeln im Schema Erstellungs-, Lese-, Aktualisierungs- oder Löschvorgänge zulassen. Weitere Informationen findest du unter Customize authorization rules (Anpassen der Autorisierungsregeln) auf der Amplify Docs-Website.
IAM-Autorisierung
Überprüfe die Richtlinien, die auf den AWS Identity and Access Management (IAM, Identitäts- und Zugriffsmanagement)-Benutzer oder die IAM-Rolle angewendet werden, die die Anforderung an AWS AppSync signieren. Führe den folgenden Befehl aus, um zu überprüfen, ob appsync:GraphQL im Aktionsblock für jedes der Felder, auf die der Benutzer zugreift, gewährt wird:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "appsync:GraphQL" ], "Resource": [ "arn:aws:appsync:us-east-1:111122223333:apis/graphql-api-id/types/Query/fields/field-1", "arn:aws:appsync:us-east-1:111122223333:apis/graphql-api-id/types/Mutation/fields/field-2" ] } ] }
Hinweis: Ersetze graphql-api-id durch die ID deiner GraphQL-API und field-1 und field-2 durch deine Felder.
Wenn du Amplify verwendest, um die Resolver-Zuweisungsvorlagen zu generieren, überprüfe Folgendes:
- Der Name der Rollensitzung, mit der die IAM-Anmeldeinformationen ausgestellt werden, entspricht CognitoIdentityCredentials.
- Die IAM-Anmeldeinformationen entsprechen der auth- oder unauth-Rolle, die Amplify generiert.
Wenn der Name der Rollensitzung nicht mit der Zeichenfolge übereinstimmt, wird der Zugriff auf das Feld oder die Operation verweigert.
Lambda-Autorisierung
- Überprüfe die benutzerdefinierte Logik, die du in den Lambda-Funktionscode geschrieben hast, in dem isAuthorized ausgegeben wird, um sicherzustellen, dass sie auf wahr gesetzt ist.
- Stelle sicher, dass das deniedFields-Array das angeforderte Feld oder die angeforderte Operation nicht enthält.
- Überprüfe die CloudWatch-Protokolle oder füge Debugging-Anweisungen hinzu, um den Logikfluss zu überprüfen und die Benutzerautorisierung festzulegen.
Verwendung mehrerer Autorisierungsmodi
Wenn die AWS AppSync-API über mehrere Autorisierungsmodi verfügt, verwendet die API den eingestellten Standardautorisierungsmodus. Für einen Typ oder ein Feld, das einen der anderen Autorisierungsmodi erfordert, musst du auch eine Autorisierungsrichtlinie für diesen Modus festlegen. Weitere Informationen findest du unter Verwendung mehrerer Autorisierungstypen mit AWS AppSync GraphQL-APIs. Beispielsweise ist bei einer AWS AppSync-API API_KEY als Standardautorisierungsmodus festgelegt und AMAZON_COGNITO_USER_POOLS als zusätzlicher Autorisierungsmodus. Wenn du beide Modi verwenden möchtest, musst du die Autorisierungsrichtlinien @aws_api_key und @aws_cognito_user_pools festlegen.
type Post @aws_api_key @aws_cognito_user_pools { id: ID! author: String title: String }
Hinweis: Der standardmäßige Autorisierungsmodus API_KEY lehnt Anforderungen aus den folgenden Gründen ab:
- Ein Amazon Cognito-JWT wird im Anforderungs-Header gesendet.
- Die Richtlinien fehlen im GraphQL-Schema.
