Fehlt ein Authentifizierungstoken beim Zugriff auf das API-Gateway?


82

Ich versuche, eine Lambda-Funktion über das AWS API Gateway aufzurufen. Wenn ich den Authentifizierungstyp NONE erwähne, funktioniert dies einwandfrei, aber die API wird öffentlich und jeder mit URL kann auf meine API zugreifen. Um den API-Aufruf sicher zu machen, verwende ich den Authentifizierungstyp AWS_IAM und füge meinem Benutzer auch die AmazonAPIGatewayInvokeFullAccess-Richtlinie hinzu, erhalte jedoch den folgenden Fehler:

{ message: "Missing Authentication Token"}

Ich weiß nicht, was mir hier fehlt.


Ich glaube, dass die meisten, wenn nicht alle Antworten hier auch für jeden anderen AWS-Service (dh auch DynamoDB) funktionieren würden, der hinter einem bestimmten API-Gateway-Ressourcenendpunkt abgebildet ist. Unter der Annahme, dass dies zutrifft, ist API Gateway hier die operative Schnittstelle (nicht die AWS Service Resource).
Cellepo

Der Fehler ist darauf zurückzuführen, dass der falsche Endpunkt erreicht wurde
Rexben

Antworten:


40

Ich denke, Sie versuchen direkt, auf den API-Link zuzugreifen. Dies funktioniert nicht, da die API mithilfe der IAM-Rolle gesichert ist und Sie die AWS-Authentifizierung, dh den Zugriffsschlüssel und den geheimen Schlüssel, bereitstellen müssen.

Verwenden Sie die Postman Chrome-Erweiterung, um Ihre API zu testen: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


Hallo Saddam, wie die AWS-Authentifizierung in SOAP ui durchgeführt werden kann. In POSTMAN ist es sehr einfach. Haben wir ähnliche Möglichkeiten in der SOAP-Benutzeroberfläche?
Pankaj Sharma

154

Ich habe aus einem dummen Grund etwas Zeit verloren:

Wenn Sie eine Phase erstellen, enthält der angezeigte Link nicht den Ressourcenteil der URL:

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

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

Die / get-Liste fehlte

Und natürlich müssen Sie überprüfen, ob die Methodenkonfiguration folgendermaßen aussieht:

Geben Sie hier die Bildbeschreibung ein


11
Ein besonderes Lob ist erforderlich, um dumme (aber häufige) Gründe für ein Problem zuzugeben. Das hat mich auch erwischt.
Jeff Richards

Entschuldigung, ich habe nicht verstanden, was Sie gemeint haben. Wenn Sie überprüfen möchten, ob eine Post-Anfrage für die Verwendung der Authentifizierung eingerichtet ist, müssen Sie unter der von Ihnen erstellten Ressource auf die Option POST klicken. Möglicherweise haben Sie / my- Nach dem Aufruf in Ihren Ressourcen und darunter haben Sie OPTION- und POST-Methoden. Klicken Sie auf den POST und sehen Sie dort in der Methodenkonfiguration, ob eine Authentifizierung erforderlich ist. Wenn Sie jedoch die vollständige URL zu einem Post-Call erhalten möchten, funktioniert dies genauso wie eine API-URL + RESOURCE, z. B. 1111.execute-api.us-east-1.amazonaws.com/dev/my- pos-tcall
Carlos Alberto Schneider

2
Eine verwandte, dumme Sache, die mich gestolpert hat: Stellen Sie sicher, dass Ihr HTTP-Verb korrekt ist. Ich habe versehentlich ein GET anstelle eines POST gesendet. Es scheint, dass Sie diesen Fehler auf jeder Route erhalten, die in Bezug auf Pfad und Verb nicht genau übereinstimmt .
Josh1billion

Vielen Dank !! Es ist so einfach, als Sie es erwähnt haben. Ich habe es nicht bemerkt. Danke mann!
Ylev

FWIW, wenn Sie zuerst im Stages-Baum auf die Ressource selbst (in diesem Fall GET) klicken, sollte die vollständige URL für diese Ressource direkt angezeigt werden. Weitere Details und ein erklärendes Bild in meiner verwandten Antwort: stackoverflow.com/a/60858537/1357094
cellepo

21

Ich hatte gerade das gleiche Problem und es scheint, dass diese Meldung auch angezeigt wird, wenn die Ressource nicht gefunden werden kann.

In meinem Fall hatte ich die API aktualisiert, aber vergessen, sie erneut bereitzustellen. Das Problem wurde behoben, nachdem die aktualisierte API auf meiner Stufe bereitgestellt wurde.


So habe ich es zum Laufen gebracht. Die Ressource erneut bereitgestellt!.
KQI

7

Es sieht so aus, als ob (ab April 2019) AWS API Gateway diese Ausnahme aus verschiedenen Gründen auslöst - hauptsächlich, wenn Sie einen Endpunkt erreichen, den API Gateway nicht erreichen kann, entweder weil er nicht bereitgestellt wird oder auch in Fällen, in denen dies der Fall ist Die HTTP-Methode wird nicht unterstützt.

Ich wünschte, das Gateway sendet geeignetere Fehlercodes wie die nicht unterstützte HTTP 405-Methode oder die nicht gefundene HTTP 404-Methode anstelle eines generischen HTTP 403 Forbidden.


7

Stellen Sie sicher, dass Sie zuerst in der Stufenstruktur auf die bestimmte Ressource klicken, da dadurch eine URL mit dem vollständigen Pfad zur Ressource (und nicht nur mit dem Stammpfad) gefüllt wird: Geben Sie hier die Bildbeschreibung ein

Weitere Ursachen finden Sie unter http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/



@sumanthshetty hast du diese Lösung oder einen der restlichen Antworten hier ausprobiert? Oder haben Sie den AWS-Link von hier aus gelesen?
Cellepo

Ich habe alle Antworten von hier und auch den Artikel
Sumanth Shetty

6

Stellen Sie sicher, dass Sie eine Ressource erstellen und anschließend eine Methode darin erstellen. Das war das Problem für mich. Vielen Dank

Geben Sie hier die Bildbeschreibung ein


5

Fand dies in den Dokumenten:

Wenn die AWS_IAM-Autorisierung verwendet würde, würden Sie die Anforderung mit den Protokollen der Signaturversion 4 signieren.

Signieranfrage mit Signatur Version 4


Sie können auch ein SDK für Ihre API generieren.

So generieren Sie ein SDK für eine API in API Gateway

Sobald Sie das SDK für die Plattform Ihrer Wahl generiert haben, wird in Schritt 6 erwähnt, dass bei Verwendung von AWS-Anmeldeinformationen die Anforderung an die API signiert wird:

  1. Verwenden Sie zum Initialisieren des vom API-Gateway generierten SDK mit AWS-Anmeldeinformationen den folgenden Code. Wenn Sie AWS-Anmeldeinformationen verwenden, werden alle Anforderungen an die API signiert. Dies bedeutet, dass Sie für jede Anforderung die entsprechenden CORS Accept-Header festlegen müssen:

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

4

Wenn Sie die AWS_IAM-Authentifizierung aktivieren, müssen Sie Ihre Anforderung mit AWS-Anmeldeinformationen unter Verwendung von AWS Signature Version 4 signieren .

Hinweis : Wenn Sie sich bei der AWS-Konsole anmelden, werden die Anforderungen Ihres Browsers nicht automatisch bei Ihrer API signiert.


3

Manchmal wird diese Meldung angezeigt, wenn Sie eine falsche API aufrufen

Überprüfen Sie Ihren API-Endpunkt


2

Ich versuche alles oben Genannte, wenn Sie alle Schritte in den obigen Antworten ausgeführt haben und das Problem nicht lösen, dann:

  1. Klicken Sie im linken Menü auf "Ressourcen".
  2. Klicken Sie rechts auf "Ressourcen" auf die API-Methode, die Sie testen möchten, z. B. "POST / GET usw."
  3. Klicken Sie auf die Liste "ACTION" (über der API-Methode in Schritt 2)
  4. Wählen Sie "DEPLOY API" (bitte tun Sie dies, auch wenn Sie Ihre API bereits bereitgestellt haben).
  5. Wählen Sie in der "Bereitstellungsphase" "Produkt" oder was auch immer Sie in Ihrer vorherigen Bereitstellung schreiben (es überschreibt Ihre vorherige Bereitstellung
  6. Klicken Sie auf "Bereitstellen"

Ich denke, dass ich beim Erstellen der "METHODENANFRAGE" (siehe Schritt 2, wie man zu diesem Menü gelangt) in "Autorisierung" nach dem Testen der API "AWS_IAM" auswähle, in der aws-Testoption versuche ich es in "Postbote" "dann verstehe ich das in" METHODENANFRAGE ", in" Autorisierung "sollte ich" keine "auswählen

Ich ändere es in "Keine", aber ich denke, die AWS muss es erneut bereitstellen, wie ich erkläre


1

Dieser Fehler tritt meistens auf, wenn Sie einen falschen API-Endpunkt aufrufen. Überprüfen Sie Ihren API-Endpunkt, den Sie anrufen, und überprüfen Sie dies auf dem API-Gateway.


1

Wenn Sie eine API mit einem Endpunkt vom Typ PRIVATE verwenden , stellen Sie Folgendes sicher:

  1. Sie rufen die API in Ihrem AWS-Konto auf (Beispiel: von einer in Ihrem Konto erstellten EC2-Instanz).

  2. Fügen Sie die erforderlichen Anmeldeinformationen (Zugriffs- und geheime Schlüssel) in die EC2-Instanz in route ~ / .aws / credentials ein (diese Route gilt für Linux-Instanzen). Wenn der IAM-Benutzer den MFA- Wert aws_session_token verwendet, ist ebenfalls ein Wert erforderlich.

  3. Verwenden Sie eine auf vpce (vpc endpoint) basierende URL. Beispiel: Curl https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status

  4. Ihre EC2-Instanz verfügt über eine Sicherheitsgruppe, die ausgehenden Datenverkehr zu einer anderen Sicherheitsgruppe des vpce zulässt, z. EC2-Instanz sg

  5. Ihre vpce-Sicherheitsgruppe lässt eingehenden Datenverkehr von einer anderen Sicherheitsgruppe (vorherige SG von der ec2-Instanz) zu, die der EC2-Instanz gehört, wie z. vpce sg

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


0

Überprüfen Sie zunächst, ob die in der Lamda-Funktion erstellte API in Ihrem AWS-Projekt registriert ist oder nicht. Wechseln Sie dazu zum API-Gateway in Ihrer AWS-Konsole. Wenn es nicht registriert ist, registrieren Sie es. Dies ist die Hauptursache für dieses Problem.

Sie können sogar in Ihrer Datei aws.export.js sehen , dass es Pfade gibt, die Ihrer API entsprechen ['/items'].

Ihre API muss dort vorhanden sein, sonst wird das Sicherheitstoken nicht an Anforderungen angehängt. Registrieren Sie es dazu einfach in Ihrer Projekt-Cloud-Logik in Ihrer Konsole.

Wenn es dort ist, verwenden Sie die oben genannte Lösung
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


0

Wenn Sie für den Datensatz keine Anmeldeinformationen verwenden würden, wird dieser Fehler auch angezeigt, wenn Sie den Anforderungsvalidator in Ihrer POST / PUT-Methode auf "Body, Abfragezeichenfolgenparameter und HEADERS validieren" oder auf die andere Option "Abfragezeichenfolge validieren" setzen Parameter und HEADERS ".... in diesem Fall wird nach den Anmeldeinformationen im Header gesucht und die Anforderung abgelehnt. Zusammenfassend lässt sich sagen, dass Sie diese Option im Anforderungsvalidator nicht festlegen sollten, wenn Sie keine Anmeldeinformationen senden möchten und diese offen halten möchten (setzen Sie sie entweder auf NONE oder auf validate body).


0

Beitragen:

Ich hatte einen ähnlichen Fehler, weil meine Rückantwort nicht den 'Körper' wie folgt enthielt:

return {'statusCode': 200, 'body': "muss das body-Tag enthalten, wenn Sie es ersetzen, funktioniert es nicht"}


0

Ich hatte das gleiche Problem, das ich folgendermaßen gelöst habe:

GET Methodentest

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

0

Wenn Sie für Ihren Server eine IAM-Rolle mit der Berechtigung AmazonAPIGatewayInvokeFullAccess einrichten, müssen Sie bei jeder Anforderung weiterhin Header übergeben. Sie können dies in Python mit der Bibliothek aws-request-auth wie folgt tun:

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

In meinem Fall war es eine ziemlich dumme Sache. Ich habe mich daran gewöhnt, dass neue Entitäten mit POST erstellt werden und es mit "Missing Authentication Token" fehlgeschlagen ist. Ich habe aus irgendeinem Grund übersehen, dass es als PUT definiert wurde, was gut funktioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.