Como faço para solucionar os problemas com erros HTTP 403 do API Gateway?

Data da última atualização 16/12/2021

Ao chamar minha API do Amazon API Gateway, recebo um erro 403. Como solucionar problemas com erros 403 do API Gateway?

Breve descrição

O código de resposta HTTP 403 significa que o cliente está proibido de acessar um URL válido. O servidor entende a solicitação, mas não pode atendê-la devido a problemas do lado do cliente.

As APIs do API Gateway podem retornar respostas 403 por qualquer um dos seguintes motivos:

Problema Cabeçalho de resposta Mensagem de erro Causa raiz
Acesso negado "x-amzn-errortype" = "AccessDeniedException" “O usuário não está autorizado a acessar este recurso com uma negação explícita” O chamador não está autorizado a acessar uma API que está usando um autorizador do Lambda.
Acesso negado "x-amzn-errortype" = "AccessDeniedException" “Usuário: <user-arn>não está autorizado a executar: execute-api:Invoke on resource: <api-resource-arn> com uma negação explícita”

O chamador não está autorizado a acessar uma API que esteja usando a autorização do AWS Identity and Access Management (IAM). Ou a API tem uma política de recursos anexada que nega explicitamente o acesso ao chamador.

Para obter mais informações, consulte a política de recursos e autenticação do IAM.

Acesso negado "x-amzn-errortype" = "AccessDeniedException" “Usuário: anônimo não está autorizado a executar: execute-api:Invoke on resource: <api-resource-arn>”

O chamador não está autorizado a acessar uma API que está usando a autorização do IAM. Ou a API tem uma política de recursos anexada que não permite que o chamador invoque a API explicitamente.

Para obter mais informações, consulte a política de recursos e autenticação do IAM.

Acesso negado "x-amzn-errortype" = "AccessDeniedException" “O token de segurança incluído na requisição é inválido.” O chamador usou chaves do IAM que não são válidas para acessar uma API que está usando a autorização do IAM.
Token de autenticação ausente "x-amzn-errortype" = "MissingAuthenticationTokenException" “Token de autenticação ausente” Um token de autenticação não foi encontrado na solicitação.
Token de autenticação expirado "x-amzn-errortype" = "InvalidSignatureException" “Assinatura expirada” O token de autenticação na solicitação expirou.
A chave de API não é válida "x-amzn-errortype" = "ForbiddenException" “Identificador de chave de API inválido especificado” O chamador usou uma chave de API que não é válida para um método que requer uma chave de API.
A assinatura não é válida "x-amzn-errortype" = "InvalidSignatureException" “A assinatura de solicitação que calculamos não corresponde à assinatura que você forneceu. Verifique sua chave de acesso secreta da AWS e o método de assinatura.” A assinatura na solicitação não corresponde a do servidor ao acessar uma API que está usando a autorização do IAM.
AWS WAF filtrado "x-amzn-errortype" = "ForbiddenException" “Proibido” A solicitação é bloqueada pela filtragem do firewall da aplicação Web (WAF) quando o AWS WAF estiver ativado na API.
O caminho do recurso não existe "x-amzn-errortype" = "MissingAuthenticationTokenException" “Token de autenticação ausente” Uma solicitação sem o cabeçalho “Autorização” é enviada para um caminho de recurso da API que não existe.
O caminho do recurso não existe "x-amzn-errortype" = "IncompleteSignatureException" “O cabeçalho de autorização requer o parâmetro 'Credencial'. O cabeçalho de autorização requer o parâmetro 'Assinatura'. Authorization header requires 'SignedHeaders' parameter. O cabeçalho de autorização requer a existência de 'X-Amz-Data' ou um cabeçalho a 'Data'. Authorization=allow" Uma solicitação com um cabeçalho “Autorização” é enviada para um caminho de recurso da API que não existe.
Invocar uma API privada usando nomes DNS públicos incorretamente "x-amzn-errortype" = "ForbiddenException" “Proibido”

Invocar uma API privada de dentro de uma Amazon Virtual Private Cloud (Amazon VPC) usando nomes DNS públicos incorretamente. Por exemplo: o cabeçalho “Host” ou “x-apigw-api-id” está ausente na solicitação.

Para obter mais informações, consulte invocar sua API privada usando nomes de host DNS públicos específicos do endpoint.

Invocar uma REST API que tenha um nome de domínio personalizado usando o endpoint execute-api padrão

"x-amzn-errortype" = "ForbiddenException" “Proibido”

O autor da chamada usa o endpoint execute-api padrão para invocar uma API REST depois de desativar o endpoint padrão.

Para obter mais informações, consulte Desativar o endpoint padrão para uma API REST.

Invocar um nome de domínio personalizado do API Gateway que requer Transport Layer Security (TLS) mútuo usando um certificado de cliente que não é válido. "x-amzn-errortype" = "ForbiddenException" “Proibido”

O certificado de cliente apresentado na solicitação de API não é emitido pelo armazenamento confiável do nome de domínio personalizado ou não é válido.

Para obter mais informações, consulte como faço para solucionar os problemas com erros HTTP 403 Forbidden do API Gateway de um nome de domínio personalizado que requer TLS mútuo?

Resolução

Considerar a fonte do erro

Se o erro 403 tiver sido relatado por outros recursos, talvez haja uma causa diferente para o erro. Por exemplo:

  • Se o erro tiver sido relatado por um navegador, então ele pode ter sido causado por uma configuração de proxy incorreta. O servidor de proxy retornará um erro 403 se o acesso HTTP não for permitido.
  • Se houver outro serviço da AWS na frente da API, esse serviço poderá rejeitar a solicitação com um erro 403 na resposta. Por exemplo: Amazon CloudFront.

Identifique o que está causando o erro

Se você ainda não o fez, configure o log de acesso do Amazon CloudWatch para a sua API. Em seguida, visualize os logs de execução da sua API no CloudWatch para determinar se as solicitações estão chegando à API.

Observação: as APIs HTTP não oferecem suporte a logs de execução. Para solucionar problemas de erros 403 retornados por um nome de domínio personalizado que requer TLS mútuo e invoca uma API HTTP, é necessário fazer o seguinte:

1.    Crie um novo mapeamento de API para seu nome de domínio personalizado que invoca uma REST API apenas para fins de teste.

2.    Identifique o que está causando os erros visualizando os logs de execução da REST API no CloudWatch.

3.    Depois que o erro for identificado e resolvido, redirecione o mapeamento da API do seu nome de domínio personalizado de volta para a HTTP API.

Confirme se o recurso solicitado existe na definição da API

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), verifique se está usando a versão mais recente da AWS CLI.

Verifique o seguinte usando o console do API Gateway ou a AWS CLI:

  • A API foi implantada com a definição de API mais recente.
  • O recurso solicitado existe na definição da API.

Usar o comando curl para obter detalhes da solicitação e da resposta

Se o erro não puder ser reproduzido, use o comando curl -v para obter mais detalhes entre o cliente e a API.

exemplo de comando curl -v

curl -X HTTP_VERB -v https://{api_id}.execute-api.{region}.amazonaws.com/{stage_name}/{resource_name}

Observação: para obter mais informações, consulte o site do projeto curl.

Verifique se o cabeçalho da solicitação está correto

Se o erro for o resultado de uma chave de API que não é válida, verifique se o cabeçalho “x-api-key” foi enviado na solicitação.

Verifique se a configuração de DNS em qualquer interface do endpoint da VPC está definida corretamente

Observação: confirme se as APIs invocadas de um Amazon VPC tenham apenas uma interface de endpoint da VPC.

Verifique se a configuração de DNS da interface do endpoint está definida corretamente com base no tipo de API que você está usando.

Tenha em mente o seguinte:

Analise a política de recursos da API

Analise a política de recursos de sua API para verificar o seguinte:

Analise as mensagens de solicitação e resposta HTTP

Reproduza o erro em um navegador da web, se possível. Em seguida, use as ferramentas de rede do navegador para capturar as mensagens de solicitação e resposta HTTP e analisá-las para determinar onde o erro ocorreu.

Observação: para análise offline, salve as mensagens em um arquivo HTTP Archive (HAR).