Wie behebe ich „Unauthorized“-Fehler (fehlende Autorisierung) beim Ausführen von GraphQL-Anforderungen in AWS AppSync?

Lesedauer: 5 Minute
0

Ich erhalte „Unauthorized“-Fehlermeldungen, wenn ich GraphQL-Anforderungen mit AWS AppSync ausführe. Wie können diese Fehler behoben werden?

Kurzbeschreibung

Es gibt zwei Arten von „Unauthorized“-Fehlern, die durch den HTTP-Statuscode definiert werden, der in der Antwort zurückgegeben werden:

  • 401 Unauthorized: Die Anforderung wird entweder von AWS AppSync oder dem Autorisierungsmodus abgelehnt, weil die Anmeldeinformationen fehlen oder ungültig sind.
  • Antwort 200 OK bei einem Fehler vom Typ Unauthorized: Die Anforderung wird aufgrund eines Problems innerhalb oder außerhalb der Resolver-Ebene abgelehnt.

Versuchen Sie, das Problem in einem Webbrowser zu reproduzieren, um die Ursache des „Unauthorized“-Fehlers zu ermitteln. Erfassen Sie dann mithilfe der Netzwerktools des Browsers die HTTP-Anforderungs- und Antwortnachrichten. Analysieren Sie die Meldungen, um festzustellen, wo der Fehler aufgetreten ist. Um sie offline zu analysieren, speichern Sie die Meldungen in einer HTTP-Archivdatei (HAR).

Lösung

Antwort 401 Unauthorized

Überprüfen Sie bei einer Antwort 401 Unauthorized die Netzwerkanforderung, die die GraphQL-Payload sendet, auf Folgendes:

  • Der Autorisierungs- oder x-api-key-Header ist vorhanden und enthält die korrekten Anmeldeinformationen für den Autorisierungsmodus, den der Vorgang oder das Feld erfordert. Wenn der Header nicht über die richtigen Anmeldeinformationen verfügt, lehnt der Autorisierungsmodus die Anforderung ab.
  • Bei JSON Web Tokens (JWT) enthält der Autorisierungsheader nicht den Text „Bearer“ (von der GitHub-Website).
  • Das JWT stammt aus dem richtigen Amazon Cognito-Benutzerpool oder vom richtigen OIDC-Anbieter.
  • Die Anmeldeinformationen sind gültig und nicht abgelaufen.

Antwort 200 OK

Um weitere Informationen darüber zu erhalten, wodurch Unauthorized-Fehler bei einer Antwort 200 OK verursacht werden, aktivieren Sie Amazon CloudWatch Logs in der AWS AppSync-API. Als bewährte Methode für die Problembehandlung sollten Sie die Protokollierung auf Feldebene auf Alle festlegen und ausführlichen Inhalt einschließen.

Anforderungen, die eine Antwort 200 OK mit einem Fehler des Typs Unauthorized und der Meldung Not Authorized to access X on type Y (Nicht autorisiert für den Zugriff auf X auf Typ Y) erhalten, werden von der Logik der Resolver-Zuordnungsvorlagen der Apache Velocity Template Language (VTL) abgelehnt. Führen Sie zum Beheben dieses Problems die folgenden Schritte zur Fehlerbehebung für den von Ihnen verwendeten Autorisierungsmodus aus.

Amazon Cognito- und OIDC-Autorisierung

Vergleichen Sie die Token-Ansprüche des Benutzers, wie Gruppen, email_verified und Client-ID oder Audience, mit den Autorisierungsprüfungen in den VTL-Resolver-Zuordnungsvorlagen. Sie können die Token-Ansprüche mithilfe des Drittanbieter-Tools jwt.io (von AuthO) überprüfen. Stellen Sie bei Verwendung von AWS Amplify sicher, dass die Token-Ansprüche die Autorisierungsregelanforderungen für den Modellschematyp unterstützen.

Die folgende Resolver-Zuordnungsvorlage für Amplify überprüft beispielsweise die Daten, die bei der vorläufigen Autorisierungsprüfung durch AWS AppSync übergeben wurden.

#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

Stellen Sie, wenn Sie Amplify verwenden, außerdem sicher, dass die Autorisierungsregeln für das Schema Vorgänge zum Erstellen, Lesen, Aktualisieren oder Löschen zulassen.

IAM-Autorisierung

Überprüfen Sie die Richtlinien, die auf den Benutzer oder die Rolle aus dem AWS Identity and Access Management (IAM) angewendet werden, von dem oder der die Anforderung an AWS AppSync signiert wird. Stellen Sie sicher, dass appsync:GraphQL im Block Action für jedes Feld gewährt wird, auf das der Benutzer zugreift.

{
  "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: Ersetzen Sie graphql-api-id durch die ID Ihrer GraphQL-API und field-1 und field-2 durch Ihre Felder.

Wenn Sie Amplify zum Generieren der Resolver-Zuordnungsvorlagen verwenden, überprüfen Sie Folgendes:

  • Der Name der Rollensitzung, mit dem die IAM-Anmeldeinformationen ausgegeben werden, entspricht CognitoIdentityCredentials.
  • Die IAM-Anmeldeinformationen entsprechen der von Amplify generierten Auth- oder Unauth-Rolle.

Wenn der Name der Rollensitzung nicht mit der Zeichenfolge übereinstimmt, wird der Zugriff auf das Feld oder den Vorgang verweigert.

Lambda-Autorisierung

  • Überprüfen Sie jede in den Lambda-Funktionscode geschriebene benutzerdefinierte Logik, wo isAuthorized ausgegeben wird, um sicherzustellen, dass sie auf true gesetzt ist.
  • Stellen Sie sicher, dass das Array deniedFields nicht das angeforderte Feld oder den angeforderten Vorgang enthält.
  • Überprüfen Sie die CloudWatch-Protokolle oder fügen Sie Debug-Anweisungen hinzu, um den logischen Ablauf für die Bestimmung der Benutzerautorisierung zu überprüfen.

Verwendung mehrerer Autorisierungsmodi

Wenn Ihre AWS AppSync API über mehrere Autorisierungsmodi verfügt, verwendet die API den als Standard festgelegten Autorisierungsmodus. Für einen Typ oder ein Feld, das einen der anderen Autorisierungsmodi erfordert, müssen Sie auch eine Autorisierungsanweisung für diesen Modus festlegen. Weitere Informationen finden Sie unter Mehrerer Autorisierungstypen mit GraphQL-APIs AWS AppSync verwenden.

Beispielsweise ist für eine AWS AppSync API API_KEY als Standardautorisierungsmodus und AMAZON_COGNITO_USER_POOLS als zusätzlicher Autorisierungsmodus festgelegt. Wenn Sie beide Modi verwenden möchten, müssen Sie die Autorisierungsanweisungen @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 folgenden Gründen ab:

  • Im Anforderungs-Header wird ein Amazon Cognito JWT gesendet.
  • Die Anweisungen fehlen im GraphQL-Schema.

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren