¿Falta el token de autenticación al acceder a API Gateway?


82

Estoy intentando llamar a una función Lambda a través de AWS API Gateway. Cuando menciono el tipo de autenticación NINGUNO, funciona bien, pero la API se vuelve pública y cualquier persona con url puede acceder a mi API. Para hacer que la llamada a la API sea segura, estoy usando el tipo de autenticación AWS_IAM y también adjunto la política AmazonAPIGatewayInvokeFullAccess a mi usuario, pero obtengo este error:

{ message: "Missing Authentication Token"}

No sé lo que me estoy perdiendo aquí.


Creo que la mayoría, si no todas, las respuestas aquí también funcionarían para cualquier otro servicio de AWS (es decir, también DynamoDB) mapeado detrás de un punto final de recurso de puerta de enlace de API determinado. Suponiendo que eso sea cierto, API Gateway es la interfaz operativa aquí (no el recurso de servicio de AWS).
Cellepo

El error es el resultado de alcanzar el punto final incorrecto
Rexben

Respuestas:


40

Creo que está intentando acceder directamente al enlace de la API, esto no funcionará porque la API está protegida mediante el rol de IAM y debe proporcionar autenticación de AWS, es decir, clave de acceso y clave secreta.

Utilice la extensión Postman de Chrome para probar su API: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


Hola Saddam, Cómo se puede realizar la autenticación de AWS en SOAP ui. En POSTMAN, es muy fácil. ¿Tenemos una forma similar en SOAP UI?
Pankaj Sharma

154

He perdido algo de tiempo por una tonta razón:

Cuando crea una etapa, el enlace que se muestra no contiene la parte de recursos de la URL:

URL de la API: https://1111.execute-api.us-east-1.amazonaws.com/dev

API + URL DE RECURSOS https://1111.execute-api.us-east-1.amazonaws.com/dev/get-list

El / lista de obtener faltaba

Y, por supuesto, debe verificar que la configuración del método tenga este aspecto:

ingrese la descripción de la imagen aquí


11
Se requieren felicitaciones especiales para admitir razones tontas (pero comunes) para un problema. Esto también me atrapó.
Jeff Richards

Lo siento, no entendí lo que quería decir. Si desea verificar si una solicitud de publicación está configurada para usar la autenticación, debe hacer clic en la opción POST, debajo del recurso que creó, por ejemplo, puede tener / my- post-call en sus recursos, y debajo de él, tiene métodos OPTION y POST. Haga clic en POST, y luego en la configuración del método, allí podrá ver si se requiere autenticación. Pero si desea obtener la URL completa de una llamada posterior, funciona de la misma manera que obtener una URL de API + RECURSO, por ejemplo, 1111.execute-api.us-east-1.amazonaws.com/dev/my- pos-tcall
Carlos Alberto Schneider

2
Algo relacionado y tonto que me hizo tropezar: asegúrate de que tu verbo HTTP sea correcto. Estaba enviando un GET en lugar de un POST por error. Parece que obtendrá este error en cualquier ruta que no coincida exactamente en términos de ruta y verbo.
Josh1billion

Muchas gracias !! Es tan simple cuando lo mencionaste. No me di cuenta. ¡Gracias hombre!
ylev

FWIW, haciendo clic en el recurso en sí (en este caso, GET) primero en el árbol de etapas, creo que debería revelar la URL completa para ese recurso directamente. Más detalles y una foto explicativa en mi respuesta relacionada: stackoverflow.com/a/60858537/1357094
cellepo

21

Acabo de tener el mismo problema y parece que también muestra este mensaje si no se puede encontrar el recurso.

En mi caso, había actualizado la API, pero olvidé volver a implementarla. El problema se resolvió después de implementar la API actualizada en mi escenario.


Así es como lo hice funcionar. ¡Re-desplegó el recurso !.
KQI

7

Parece que (a partir de abril de 2019) AWS API Gateway lanza esta excepción por una variedad de razones, principalmente cuando llega a un punto final al que API Gateway no puede alcanzar, ya sea porque no está implementado, o también en casos en los que ese El método HTTP no es compatible.

Deseo que la puerta de enlace envíe códigos de error más apropiados, como HTTP 405 Method not supported o HTTP 404 not found, en lugar de un HTTP 403 Forbidden genérico.


7

Asegúrese de hacer clic en el recurso específico primero en el árbol de Etapas, ya que se completará una URL con la ruta completa al recurso (en lugar de solo la ruta raíz): ingrese la descripción de la imagen aquí

Para otras causas, consulte http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/


¿Podría echar un vistazo a este stackoverflow.com/questions/62894455/…
sumanth shetty

@sumanthshetty, ¿probaste esta solución o cualquiera de las otras respuestas aquí? ¿O leyó el enlace de AWS desde aquí?
cellepo


6

Asegúrese de crear Resource y luego crear un método dentro de él. Ese fue el problema para mí. Gracias

ingrese la descripción de la imagen aquí


5

Encontré esto en los documentos:

Si se utilizara la autorización AWS_IAM, firmaría la solicitud utilizando los protocolos Signature Version 4.

Solicitud de firma con Signature Version 4


También puede generar un SDK para su API.

Cómo generar un SDK para una API en API Gateway

Una vez que haya generado el SDK para la plataforma de su elección, el paso 6 menciona que si está usando credenciales de AWS, se firmará la solicitud a la API:

  1. Para inicializar el SDK generado por API Gateway con credenciales de AWS, utilice un código similar al siguiente. Si usa credenciales de AWS, se firmarán todas las solicitudes a la API. Esto significa que debe establecer los encabezados de aceptación de CORS adecuados para cada solicitud:

    var apigClient = apigClientFactory.newClient({
      accessKey: 'ACCESS_KEY',
      secretKey: 'SECRET_KEY',
    });
    

4

Si habilita la autenticación de AWS_IAM, debe firmar su solicitud con las credenciales de AWS utilizando AWS Signature Version 4 .

Nota : iniciar sesión en la consola de AWS no firma automáticamente las solicitudes de su navegador a su API.


3

a veces este mensaje se muestra cuando llamas a una API incorrecta

verifique su punto final de api


2

Intento todo lo anterior, si siguió todos los pasos de las respuestas anteriores y no resuelve el problema, entonces:

  1. en el menú de la izquierda, presiona "Recursos"
  2. a la derecha de "Recursos", presione el método de API que desea probar, como "POST / GET, etc.)
  3. presione la lista "ACCIÓN" (está arriba del método API en el paso 2
  4. seleccione "DEPLOY API" (hágalo, incluso si ya implementó la suya)
  5. en la "etapa de implementación", seleccione "prod" o lo que escriba en la implementación anterior (anulará la implementación anterior
  6. golpear desplegar

Creo que por eso, cuando creo el "MÉTODO DE SOLICITUD" (ver paso 2 cómo ir a este menú), en "Autorización" selecciono "AWS_IAM" después de probar la API, en la opción de prueba aws, lo intento en "cartero "entonces entiendo que en" SOLICITUD DE MÉTODO ", en" Autorización ", debo seleccionar" ninguna "

Lo cambio a ninguno, pero creo que AWS, necesito implementarlo nuevamente, como explico


1

Este error se produce principalmente cuando llama al punto final de la API incorrecto. Verifique el punto final de la API al que está llamando y verifique esto en la puerta de enlace de la API.


1

Si está utilizando una API con punto final de tipo PRIVADO , asegúrese de:

  1. Está invocando la API desde su cuenta de AWS (ejemplo: desde una instancia EC2 creada en su cuenta)

  2. Coloque la credencial necesaria (claves de acceso y secretas) en la instancia EC2 en la ruta ~ / .aws / credentials (esta ruta es para instancias de Linux) Si el usuario de IAM usa MFA, el valor aws_session_token también será requerido.

  3. Utilice una URL basada en vpce (punto final de vpc). Ejemplo: curl https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status

  4. Su instancia EC2 tiene un grupo de seguridad que permite el tráfico saliente a otro grupo de seguridad propiedad del vpce como: Instancia EC2 sg

  5. Su grupo de seguridad vpce permite el tráfico entrante de otro grupo de seguridad (sg anterior de la instancia ec2) propiedad de la instancia EC2 como: vpce sg

Ver: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html


0

En primer lugar, compruebe si la API que creó en la función lamda está registrada con su proyecto de AWS o no. Para eso, vaya a la puerta de enlace API en su consola de AWS. Si no está registrado, regístrelo. Esta es la principal causa de este problema.

Incluso puede ver en su archivo aws.export.js , que hay rutas correspondientes a su API ['/items'].

Su API debe estar presente allí; de lo contrario, no agregará el token de seguridad a las solicitudes. Simplemente regístrelo en la lógica de la nube de su proyecto en su consola para esto.

Si está allí, utilice la solución mencionada anteriormente
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


0

Para el registro, si no usarías credenciales, este error también se muestra cuando configuras el validador de solicitudes en tu método POST / PUT para "validar cuerpo, parámetros de cadena de consulta y ENCABEZADOS", o la otra opción "validar cadena de consulta parámetros y ENCABEZADOS ".... en ese caso buscará las credenciales en el encabezado y rechazará la solicitud. En resumen, si no tiene la intención de enviar credenciales y desea mantenerlo abierto, no debe configurar esa opción en el validador de solicitudes (configúrelo en NINGUNO o para validar el cuerpo)


0

Contribuir:

Tuve un error similar porque mi respuesta de devolución no contenía el 'cuerpo' como este:

return {'statusCode': 200, 'body': "debe contener la etiqueta del cuerpo si la reemplazas no funcionará"}


0

Tuve el mismo problema que resolví de la siguiente manera:

Prueba del método GET

https://54wtstq8d2.execute-api.ap-southeast-2.amazonaws.com/dev/echo/hello
Authorization tab -> 
•   select type(AWS signature)
•   Add AccessKey and SecretKey

0

Si configura una función de IAM para su servidor que tiene el permiso AmazonAPIGatewayInvokeFullAccess, aún debe pasar encabezados en cada solicitud. Puede hacer esto en Python con la biblioteca aws-request-auth así:

import requests
from aws_requests_auth.boto_utils import BotoAWSRequestsAuth
auth = BotoAWSRequestsAuth(
    aws_host="API_ID.execute-api.us-east-1.amazonaws.com",
    aws_region="us-east-1",
    aws_service="execute-api"
)
response = requests.get("https://API_ID.execute-api.us-east-1.amazonaws.com/STAGE/RESOURCE", auth=auth)

0

En mi caso fue una estupidez. Me he acostumbrado a que las nuevas entidades se crean usando POST y fallaba con el "Token de autenticación perdido". Me he perdido eso por alguna razón, se definió como PUT, que funciona bien.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.