Come posso risolvere gli errori "Unhautorized" (Non autorizzato) durante l'esecuzione di richieste GraphQL in AWS AppSync?

5 minuti di lettura
0

Ricevo errori "Unauthorized" (Non autorizzato) quando eseguo richieste GraphQL con AWS AppSync. Come posso risolvere questi errori?

Breve descrizione

Esistono due tipi di errori di mancata autorizzazione definiti dal codice di stato HTTP inviato nella risposta:

  • 401 Unauthorized: la richiesta viene rifiutata da AWS AppSync o dalla modalità di autorizzazione perché le credenziali sono mancanti o non valide.
  • Risposta 200 OK con un errore di tipo Unauthorized: la richiesta viene rifiutata a causa di un problema a livello del risolutore o a livello superiore.

Per determinare la causa dell'errore di mancata autorizzazione, prova a replicare il problema in un browser Web. Utilizza poi gli strumenti di rete del browser per acquisire i messaggi di richiesta e risposta HTTP. Analizza i messaggi per determinare dove si è verificato l'errore. Per analizzarli offline, salva il messaggio in un file HTTP Archive (HAR).

Risoluzione

Risposta 401 Unauthorized

Per una risposta 401 Unauthorized, verifica la richiesta di rete che invia il payload GraphQL per confermare che:

  • L'intestazione di Authorization (Autorizzazione) o di x-api-key sia presente e contenga le credenziali corrette per la modalità di autorizzazione richiesta dall'operazione o dal campo. Se l'intestazione non ha le corrette credenziali, la modalità di autorizzazione rifiuta la richiesta.
  • Per i token Web JSON (JWT), l'intestazione di autorizzazione non include il testo "Bearer" (dal sito Web GitHub).
  • Il JWT proviene dal corretto pool di utenti Amazon Cognito o dal provider OIDC.
  • Le credenziali sono valide e non scadute.

Risposta 200 OK

Per maggiori dettagli sulle cause degli errori Unauthorized quando appare la risposta 200 OK, attiva i file di log di Amazon CloudWatch nell'API di AWS AppSync. Come best practice relativa risoluzione degli errori, impostare la registrazione a livello di campo su All (Tutti), e includere i contenuti dettagliati.

Le richieste che ricevono una risposta 200 OK con tipo di errore Unauthorized e il messaggio Not Authorized to access X on type Y (Non autorizzato ad accedere ad X sul tipo Y) sono negate dalla logica nei modelli di mappatura del risolutore Apache Velocity Template Language (VTL). Per risolvere questo problema, completa i seguenti passaggi per la risoluzione di problemi nella modalità di autorizzazione in uso.

Autorizzazione Amazon Cognito e OIDC

Confronta le attestazioni di token dell'utente, come gruppi, email_verified e ID client o audience, con i controlli di autorizzazione nei modelli di mappatura del risolutore VTL. Per verificare le attestazioni dei token, è possibile utilizzare lo strumento di terze parti jwt.io (da AuthO). Se stai utilizzando AWS Amplify, verifica che le attestazioni di token supportino i requisiti delle regole di autorizzazione per il tipo di schema del modello.

Ad esempio, il seguente modello di mappatura del risolutore per Amplify controlla i dati esaminati dal controllo di autorizzazione preliminare eseguito da AWS AppSync.

#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

Inoltre, se utilizzi Amplify, verifica che le regole di autorizzazione sullo schema consentano operazioni di creazione, lettura, aggiornamento o eliminazione.

Autorizzazione IAM

Esamina le policy applicate all'utente o al ruolo AWS Identity and Access Management (IAM) che firma la richiesta ad AWS AppSync. Verifica che AppSync:GraphQL sia autorizzato nel blocco Action (Operazione) per ciascuno dei campi a cui l'utente accede.

{
  "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"
      ]
    }
  ]
}

Nota: sostituisci graphql-api-id con l'ID dell'API GraphQL e field-1 e field-2 con i tuoi campi.

Se utilizzi Amplify per generare i modelli di mappatura del risolutore, verifica quanto segue:

  • Il nome della sessione di ruolo con cui vengono emesse le credenziali IAM è uguale a CognitoIdentityCredentials.
  • Le credenziali IAM sono le stesse del ruolo di autenticazione o non autenticazione generato da Amplify.

Se il nome della sessione di ruolo non corrisponde alla stringa, l'accesso al campo o all'operazione viene negato.

Autorizzazione Lambda

  • Controlla ogni logica personalizzata scritta nel codice della funzione Lambda in cui è stato emesso isAuthorized, per assicurarti che sia impostato su true.
  • Assicurati che la matrice DeniedFields non contenga il campo o l'operazione richiesti.
  • Controlla i registri di CloudWatch o aggiungi istruzioni di debug per verificare il flusso logico e determinare l'autorizzazione dell'utente.

Utilizzo di più modalità di autorizzazione

Quando l'API di AWS AppSync dispone di più modalità di autorizzazione, utilizza la modalità di autorizzazione impostata come predefinita. Per un tipo o un campo che richiede una delle altre modalità di autorizzazione, è necessario impostare anche una direttiva di autorizzazione per quella modalità. Per ulteriori informazioni, consulta Using multiple authorization types with AWS AppSync GraphQL APIs.

Ad esempio, un'API di AWS AppSync ha API_KEY impostato come modalità di autorizzazione predefinita e AMAZON_COGNITO_USER_POOLS come modalità di autorizzazione aggiuntiva. Se desideri utilizzare entrambe le modalità, è necessario impostare le direttive di autorizzazione @aws_api_key e @aws_cognito_user_pools.

type Post @aws_api_key @aws_cognito_user_pools {
 id: ID!
 author: String
 title: String
}

Nota: la modalità di autorizzazione predefinita API_KEY rifiuta le richieste per i seguenti motivi:

  • Un JWT di Amazon Cognito è inviato nell'intestazione della richiesta.
  • Le direttive non sono presenti nello schema GraphQL.

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa