Como soluciono problemas de erros “não autorizado” ao executar solicitações do GraphQL no AWS AppSync?

5 minuto de leitura
0

Recebo erros “Não autorizado” quando executo solicitações do GraphQL com o AWS AppSync. Como corrigir esses erros?

Breve descrição

Há dois tipos de erros “não autorizado” que são definidos pelo código de status HTTP retornado na resposta:

  • 401 Não autorizado: a solicitação é negada pelo AWS AppSync ou pelo modo de autorização porque as credenciais estão ausentes ou são inválidas.
  • Resposta 200 OK com um erro de tipo Não autorizado: a solicitação é negada devido a um problema no nível do resolvedor ou além dele.

Para determinar a causa do erro não autorizado, tente reproduzir o problema em um navegador Web. Em seguida, use as ferramentas de rede do navegador para capturar as mensagens de solicitação e resposta HTTP. Analise as mensagens para determinar onde o erro ocorreu. Para análise offline, salve as mensagens em um arquivo HTTP Archive (HAR).

Resolução

401 Resposta não autorizada

Para obter uma resposta 401 Não autorizada, verifique a solicitação de rede que envia a carga útil do GraphQL para confirmar que:

  • O cabeçalho Authorization (Autorização) ou x-api-key está presente e contém as credenciais corretas para o modo de autorização exigido pela operação ou campo. Se o cabeçalho não tiver as credenciais corretas, o modo de autorização rejeitará a solicitação.
  • Para JSON Web Tokens (JWT), o cabeçalho de autorização não inclui o texto “Portador” (do site do GitHub).
  • O JWT é do grupo de usuários ou provedor OIDC correto do Amazon Cognito.
  • As credenciais são válidas e não expiraram.

Resposta 200 OK

Para obter mais detalhes sobre o que causa erros Não autorizado para uma resposta 200 OK, ative os logs do Amazon CloudWatch na API do AWS AppSync. Como prática recomendada para solução de problemas, defina o registro em nível de campo como All (Todos) e inclua conteúdo detalhado.

As solicitações que recebem uma resposta 200 OK com o tipo de erro Não autorizado e a mensagem Não autorizado a acessar X no tipo Y são negadas pela lógica nos modelos de mapeamento do resolvedor Apache Velocity Template Language (VTL). Para resolver esse problema, conclua as etapas de solução de problemas a seguir para o modo de autorização que você usa.

Autorização do Amazon Cognito e do OIDC

Compare as declarações de token do usuário, como grupos, email_verified e ID do cliente ou público-alvo, com as verificações de autorização nos modelos de mapeamento do resolvedor de VTL. Você pode usar a ferramenta de terceiros jwt.io (do AuthO) para verificar as declarações de token. Se você estiver usando o AWS Amplify, verifique se as declarações de token são compatíveis com os requisitos da regra de autorização no tipo de esquema do modelo.

Por exemplo, o modelo de mapeamento de resolvedor a seguir para o Amplify verifica os dados passados da verificação de autorização preliminar que o AWS AppSync faz.

#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

Além disso, se você estiver usando o Amplify, verifique se as regras de autorização no esquema permitem operações de criação, leitura, atualização ou exclusão.

Autorização do IAM

Analise as políticas aplicadas ao usuário ou ao perfil do AWS Identity and Access Management (IAM) que assina a solicitação ao AWS AppSync. Verifique se appsync:GraphQL é concedido no bloco Action para cada um dos campos que o usuário acessa.

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

Observação: substitua graphql-api-id pelo ID da API do GraphQL e field-1 e field-2 pelos seus campos.

Se você estiver usando o Amplify para gerar os modelos de mapeamento do resolvedor, verifique o seguinte:

  • O nome da sessão da função com a qual as credenciais do IAM são emitidas é igual a CognitoIdentityCredentials.
  • As credenciais do IAM são as mesmas que a função auth ou unauth que o Amplify gera.

Se o nome da sessão da função não corresponder à string, o acesso ao campo ou operação será negado.

Autorização do Lambda

  • Verifique qualquer lógica personalizada que você escreveu no código de função do Lambda em que isAuthorized é emitido para garantir que ela esteja definida como true.
  • Certifique-se de que a matriz deniedFields não contenha o campo ou a operação solicitada.
  • Verifique os logs do CloudWatch ou adicione instruções de depuração para verificar o fluxo lógico a fim de determinar a autorização do usuário.

Usar vários modos de autorização

Quando a API do AWS AppSync tem vários modos de autorização, a API usa o modo de autorização padrão definido. Para um tipo ou campo que requer um dos outros modos de autorização, você também deve definir uma diretiva de autorização para esse modo. Para obter mais informações, consulte Using multiple authorization types with AWS AppSync GraphQL APIs (Usar vários tipos de autorização com as APIs do GraphQL do AWS AppSync).

Por exemplo, uma API do AWS AppSync tem API_KEY definido como o modo de autorização padrão e tem AMAZON_COGNITO_USER_POOLS como um modo de autorização adicional. Se você quiser usar os dois modos, defina as diretivas de autorização @aws_api_key e @aws_cognito_user_pools.

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

Observação: o modo de autorização API_KEY padrão rejeita solicitações pelos seguintes motivos:

  • Um JWT do Amazon Cognito é enviado no cabeçalho da solicitação.
  • As diretivas estão faltando no esquema do GraphQL.

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos