Come si risolvono gli errori "Non autorizzato" quando si eseguono richieste GraphQL in AWS AppSync?

5 minuti di lettura
0

Quando eseguo richieste GraphQL con AWS AppSync, ricevo messaggi di errore "Non autorizzato".

Breve descrizione

Esistono due tipi di errori Non autorizzato definiti dal codice di stato HTTP restituito nella risposta:

  • 401 - Non autorizzato: la richiesta viene negata da AWS AppSync o dalla modalità di autorizzazione perché le credenziali mancano o non sono valide.
  • Risposta 200 OK con un tipo di errore Non autorizzato: La richiesta viene negata a causa di un problema a livello di risolutore o oltre.

Per determinare la causa dell'errore Non autorizzato, prova a riprodurre il problema in un browser web. Quindi, utilizza 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 i messaggi in un file HTTP Archive (HAR).

Risoluzione

Risposta 401 - Non autorizzato

Per una risposta 401 - Non autorizzato, controlla la richiesta di rete che invia il payload GraphQL per confermare che:

  • L'intestazione Authorization o x-api-key è presente e contiene le credenziali corrette per la modalità di autorizzazione richiesta dall'operazione o dal campo. Se l'intestazione non contiene le credenziali corrette, la modalità di autorizzazione rifiuta la richiesta.
  • Per i token Web JSON (JWT), consulta Authorization header doesn't include the text "Bearer" sul sito web di GitHub.
  • Il JWT proviene dal pool di utenti di Amazon Cognito o dal provider OpenID Connect (OIDC) corretto.
  • Le credenziali sono valide e non scadute.

Risposta 200 OK

Per ottenere maggiori dettagli sulle cause degli errori Non autorizzato per una risposta 200 OK, attiva i log di Amazon CloudWatch sull'API AWS AppSync. Come best practice, imposta la registrazione a livello di campo su Tutto e includi il contenuto dettagliato.

Le richieste che ricevono una risposta 200 OK con il tipo di errore Non autorizzato e il messaggio Not Authorized to access X on type Y (Non autorizzato ad accedere a X sul tipo Y) sono negate dalla logica dei template di mappatura del resolver di Apache Velocity Template Language (VTL). Per risolvere questo problema, completa le seguenti operazioni di risoluzione dei problemi per la modalità di autorizzazione utilizzata.

Amazon Cognito e autorizzazione OIDC

Confronta le richieste di token dell'utente, come gruppi, email_verified e ID client o pubblico, con i controlli di autorizzazione nei template di mappatura del resolver VTL. Puoi utilizzare lo strumento di terze parti jwt.io sul sito web di AuthO per verificare le richieste di token. Se utilizzi AWS Amplify, verifica che le richieste di token supportino i requisiti delle regole di autorizzazione sul tipo di schema del modello. Ad esempio, il seguente template di mappatura del resolver per Amplify controlla i dati passati dalla verifica preliminare di autorizzazione eseguita 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. Per ulteriori informazioni, consulta Customize authorization rules sul sito web di Amplify Docs.

Autorizzazione IAM

Rivedi le policy applicate all'utente o al ruolo di AWS Identity and Access Management (AWS IAM) che firma la richiesta ad AWS AppSync. Per verificare che appsync:GraphQL sia concesso nel blocco Azione per ciascuno dei campi a cui l'utente accede, esegui il seguente comando:

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

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

Se utilizzi Amplify per generare i template di mappatura del resolver, verifica quanto segue:

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

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

Autorizzazione Lambda

  • Controlla la logica personalizzata scritta nel codice della funzione Lambda in cui viene emesso isAuthorized per assicurarti che sia impostata su true.
  • Assicurati che l'array deniedFields non contenga il campo o l'operazione richiesti.
  • Controlla i log di CloudWatch o aggiungi istruzioni di debug per verificare il flusso logico per determinare l'autorizzazione dell'utente.

Utilizzo di più modalità di autorizzazione

Quando l'API AWS AppSync dispone di più modalità di autorizzazione, viene utilizzata la modalità di autorizzazione predefinita impostata. Per un tipo o un campo che richiede una delle altre modalità di autorizzazione, è necessario impostare anche una direttiva di autorizzazione per tale modalità. Per ulteriori informazioni, consulta Using multiple authorization types with AWS AppSync GraphQL APIs. Ad esempio, un'API AWS AppSync ha API_KEY 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
}

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

  • Un JWT di Amazon Cognito viene inviato nell'intestazione della richiesta.
  • Nello schema GraphQL mancano le direttive.
AWS UFFICIALE
AWS UFFICIALEAggiornata un mese fa