Nachricht erhalten: Verbotene Antwort vom AWS API-Gateway

77

Ich versuche, einen Lambda-Dienst in AWS zu erstellen und von außen über das API-Gateway darauf zugreifen zu lassen, ohne dass eine Authentifizierung oder Einschränkung erforderlich ist.

Um die Sache zu vereinfachen, habe ich das Gateway vorerst als Mock eingerichtet.

Bei der Get-Methode der API ist die Autorisierung auf Noneund der API-Schlüssel auf festgelegt not required.

Wenn ich dies versuche, erhalte ich {"message":"Forbidden"} (dieselbe Nachricht, wenn ich es mit dem eigentlichen Lambda-Dienst verbinde).

Irgendwelche Ratschläge, wie man es zugänglich macht?

Fab
quelle
2
Haben Sie vor der Bereitstellung die Methode get hinzugefügt?
Cenxui
1
Ich frage mich, ob Sie nicht die richtige Aufruf-URL haben.
Ka Hou Ieong
4
Ich kann diese Frage nicht ablehnen, aber ich würde es gerne tun. "so etwas" -Antworten helfen der Community nicht. Ich habe verbotene Nachrichten wegen fehlerhafter Einrückung in meiner Datei serverless.yml ausprobiert.
Perimosh
12
Bitte aktivieren Sie das Häkchen neben der richtigen Antwort, anstatt [solved]Ihre Frage zu ergänzen. Vielen Dank!
Tim Malone
2
Es wäre nützlich, wenn Sie erklären würden, was falsch ist und wie Sie es behoben haben.
Eppilo

Antworten:

81

Wenn Sie die Option "API-Schlüssel erforderlich" auf "true" setzen, überprüfen Sie dies bitte unten.

  1. Sie müssen den HTTP-Header-Parameter 'x-api-key' an das API-Gateway übergeben.
  2. Der API-Schlüssel musste erstellt werden.
  3. Darüber hinaus müssen Sie einen Nutzungsplan für den API-Schlüssel in der API-Gateway-Konsole überprüfen.
Daniel Jihoon Oh
quelle
3
Danke Daniel, dein dritter Schritt erlaubt mir, meinen Fehler zu beheben.
Hector Magana
5
Das hat bei mir funktioniert, aber es musste 'X-Api-Key' sein. Sieht nach Kapitalisierung aus
pixelwiz
3
Alle drei Schritte haben es für mich getan. Ich hatte bereits einen API-Schlüssel erstellt, ihn jedoch nicht mit einem Nutzungsplan oder Ähnlichem verknüpft. Danke vielmals!
Sidewaiise
5
Punkt 3 in Ihrer Antwort wird oft übersehen. Es stellte sich heraus, dass es mein Problem war.
Eppilo
1
@Marecky und pixelwiz, ich hatte gerade ein ähnliches Problem und um die Erfahrung von pixelwiz zu erweitern, hatte ich das gleiche Problem. Nach der Suche stellte ich fest, dass AWS API Gateway ein bekanntes Problem aufweist, bei dem INDEED-Prozessheader in Groß- und Kleinschreibung ausgeführt werden. Schauen Sie sich das Ende dieser Seite an: docs.aws.amazon.com/apigateway/latest/developerguide/…
JasonBub
60

Wählen Sie im API-Gateway-Dashboard Ressourcen aus, klicken Sie auf Aktionen und wählen Sie API bereitstellen. Vor Ihrer ersten Bereitstellung erhalten Sie nur die Antwort {"message":"Forbidden"}.

jneves
quelle
12
Ich würde dies hinzufügen, nachdem Sie bereitgestellt haben, stellen Sie sicher, dass Sie Ihren Künstlernamen zur URL hinzufügen: abcdefg.execute-api.us-east-2.amazonaws.com/STAGE_NAME/
user2465134
33

Wenn Sie einen benutzerdefinierten Domainnamen verwenden und vergessen, die Zielbereitstellung auszuwählen, wird die ForbiddenNachricht angezeigt.

Gehen Sie einfach zu Custom Domain Namesund klicken Sie Editunter Ihrer Domain und wählen Sie dann die Stufe unter aus Base Path Mappings.

kontrollanten
quelle
1
Funktioniert hervorragend und folgen Sie der Antwort von @ jneves und (erneut) bereitstellen. Nach dem Festlegen des Mappings wurde es erst angezeigt, nachdem ich die aus den Basispfad-Mappings ausgewählte Phase erneut bereitgestellt hatte.
Calvin Schemanski
11

Sie müssen Ihre API auf der Bühne bereitstellen und die URL der Bühne verwenden. Gehen Sie zu Ressourcen, klicken Sie auf Aktionen und wählen Sie API bereitstellen

Nun, wenn Sie Fehler bekommen

{"message": "Forbidden"}.

Bitte überprüfen Sie die folgenden Schritte

1) Wenn Sie die API-Schlüsselkopie aktivieren und Ihren Schlüssel als Postbote übergeben

Geben Sie hier die Bildbeschreibung ein

2) Wenn Sie jetzt immer noch den gleichen Fehler erhalten, müssen Sie einen Nutzungsplan erstellen

Geben Sie hier die Bildbeschreibung ein

3) Setzen Sie ein Limit und weisen Sie Ihrer API einen Plan zu

Geben Sie hier die Bildbeschreibung ein

Vaquar Khan
quelle
kann keine Bilder sehen
Albatros
7

Ich hatte ein ähnliches Problem und Folgendes:

  1. Eine benutzerdefinierte Domain (kantenoptimiert)
  2. Mehrere Stufen (dev, inszenierung, prod)

Ich habe auch keine Autorisierung oder Einschränkungen festgelegt, um die Dinge zu vereinfachen.

Ich konnte das Problem beheben, indem ich Basispfadzuordnungen für jede meiner Stufen (dev, staging, prod) hinzufügte.

Joben R. Ilagan
quelle
Ich hatte die gleiche Grundeinstellung mit mehreren APIs. Interessanterweise erhielt ich , obwohl nur eine meiner APIs tatsächlich bereitgestellt wurde, "Verboten", bis ich Basispfadzuordnungen für die nicht bereitgestellten APIs festlegte.
Dan
5

Wenn Sie den erforderlichen 'API'-Schlüssel auf true setzen, müssen Sie den API-Schlüssel als Header übergeben.

Der API-Schlüssel wird als Header-Feld 'x-api-key' übergeben. Auch nach dem Hinzufügen dieses Felds in der Kopfzeile kann dieses Problem auftreten. In diesem Fall validieren Sie bitte die folgenden Punkte

  • Haben Sie einen Nutzungsplan? Wenn nicht, müssen Sie eine erstellen.
  • Verknüpfen Sie Ihre API mit dem Nutzungsplan. Fügen Sie dazu eine Stufe hinzu, die Ihre API verknüpft.
  • Haben Sie einen API-Schlüssel? Wenn nicht, müssen Sie einen API-Schlüssel erstellen und aktivieren.
  • Fügen Sie diesem API-Schlüssel den Nutzungsplan hinzu, der mit Ihrer API verknüpft ist. Fügen Sie dazu den Nutzungsplan hinzu.
bisw
quelle
5

Ich bin möglicherweise zu spät, aber einer der Gründe, warum API Gateway eine "verbotene" Nachricht ausgibt, ist, dass Sie Daten in Request Body für eine GET-Operation übergeben. Um das Problem zu lösen, machen Sie entweder Ihre Ressource POST oder Sie übergeben keine Daten im Anforderungshauptteil.

Ignitious Nkwinika
quelle
Ich habe Schlaflosigkeit benutzt und meine Anfrage von POST auf GET geändert. Der Anforderungstyp war noch in GraphQL Query- was 403 Forbidden Error zurückgab . Das Ändern des Anforderungstyps von GraphQL Queryauf No Bodyhat den Trick getan!
Naribo
Du hast mein Leben gerettet!
Hirikarat
4

Dies mag alles andere als offensichtlich sein, aber ein weiterer Grund für den Fehler "Verboten" bei Verwendung von AWS API Gateway ist möglicherweise der Aufruf einer falschen URL, die keiner bereitgestellten API-Methode entspricht. Es kann vorkommen, dass Sie tatsächlich eine falsche URL eingeben (z. B. anstatt anzurufen https://9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users( devPhase vorher notieren users), die Sie angerufen haben https://9999xx9x99.execute-api.us-east-1.amazonaws.com/users(keine Phase). Sie würden erwarten, 404 zu erhalten, aber Sie erhalten 403.

Übrigens: Nachdem Sie eine Bereitstellung für das https://9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/usersAnrufen vorgenommen haben https://9999xx9x99.execute-api.us-east-1.amazonaws.com/user(beachten Sie hier das Singular-Nomen-Formular), erhalten Sie ebenfalls… 403, jedoch mit der Meldung "Missing Authentication Token"!

verrückter Kopf
quelle
Dies mag alles andere als offensichtlich sein, aber ein weiterer Grund für den Fehler "Verboten" bei Verwendung von AWS API Gateway ist möglicherweise der Aufruf einer falschen URL, die keiner bereitgestellten API-Methode entspricht. Es kann vorkommen, dass Sie tatsächlich eine falsche URL eingeben (z. B. anstatt 9999xx9x99.execute-api.us-east-1.amazonaws.com/dev/users aufzurufen (beachten Sie die Entwicklungsphase vor Benutzern), die Sie 9999xx9x99.execute-api aufgerufen haben. us-east-1.amazonaws.com/users (keine Stufe). Sie würden erwarten, 404 zu bekommen, aber Sie werden 403 bekommen. Wie kann man dieses Problem im Endpunkt des Ruby Rack Aws Lambda API Gateway lösen?
Ankita Dhandha
@AnkitaDhandha, stell eine neue Frage.
Madhead
3

Wenn Authorizationund API KEY Requiredbeide für die Methode auf true gesetzt sind, stellen Sie sicher, dass Sie beim Senden der Anforderung die folgenden Header haben:

  1. Inhaltstyp (normalerweise application / x-www-form-urlencoded, wenn GET-Aufruf)
  2. GASTGEBER
  3. X-Amz-Datum
  4. Genehmigung
  5. x-api-key

Ich verwende POSTMANfür API-Tests, die ziemlich zuverlässig sind und dann einfach sind.

Hinweis: Fügen Sie keine x-api-Schlüsselüberschrift hinzu, wenn Sie API KEY REQUIREDFALSE festgelegt haben. Wenn Sie AUTHORIZATIONFALSE festgelegt haben, fügen Sie keinen Autorisierungsheader hinzu.

illusionx
quelle
3

Der einzige andere Grund, den ich erlebt habe und den ich hier nicht sehe, ist buchstäblich, dass Sie versucht haben, die API nach der Veröffentlichung zu schnell zu erreichen. Ich drücke auf "Veröffentlichen" und sehe den Domainnamen "Ihre API ist erreichbar unter" und kopiere ihn sofort und füge ihn in Postman ein, um ihn zu überprüfen.

Ich bekomme die verbotene Nachricht. Ändere nichts. Überprüfen Sie alle Einstellungen, um sicherzustellen, dass ich nichts getan habe - alles ist korrekt. Ein bisschen meine Haare ausreißen.

Kommen Sie ein paar Minuten später zurück, um es zu versuchen, denn ich bin mir ziemlich sicher, dass ich alles richtig mache - es funktioniert.

DNS Mann. Egal wie schnell das Internet ist - es ist nicht sofort :)

tgmerritt
quelle
2

Ich habe diesen Fehler von einem Nginx-Fargate-Dienst erhalten, der versucht, auf eine private API in API Gateway zuzugreifen. Ich musste in meiner API eine Richtlinie unter Ressourcenrichtlinien hinzufügen

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:<AccountID>:<RestApiID>/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "<VPC Endpoint ID for execute-api>"
                }
            }
        }
    ]
}
gary69
quelle
2

Es gibt einige Dinge zu tun, wenn wir die {Nachricht: Verboten} im API-Gateway erhalten:

CORS aktiviert?

  1. Überprüfen Sie, ob CORS in der API aktiviert ist (lassen Sie zunächst den Ursprung '*' zu, um sicherzustellen, dass wir sicher testen können).
  2. Stellen Sie die API bereit, um sicherzustellen, dass alle Einstellungen den Erwartungen entsprechen

API-Schlüssel aktiviert?

  1. Überprüfen Sie, ob der API-Schlüssel im API-Gateway aktiviert ist
  2. Überprüfen Sie, ob ein API-Schlüssel konfiguriert ist.
  3. Überprüfen Sie, ob Ihr API-Schlüssel dem richtigen Verwendungsplan zugewiesen ist, und fügen Sie eine API-Stufe hinzu. Ohne die API-Stufe erhalten Sie immer eine {Nachricht: Verboten}

Wenn Sie immer noch Probleme haben, lassen Sie es mich wissen, damit ich oder einer unserer Cloud-Gurus @levarne helfen kann.

Max Lans
quelle
2

Ich könnte auf eine Lösung für dieses Problem gestoßen sein. Ich hatte jetzt das gleiche Problem unter MacOS. Ich habe versucht, mein DNS zu leeren und dann hat es funktioniert!

Versuchen Sie dies im Terminal:

Mac OS X Yosemite und höher

sudo killall -HUP mDNSResponder

Mac OS X Yosemite 10.10 bis 10.10.3

sudo discoveryutil mdnsflushcache

Mac OS X Mavericks, Berglöwe und Löwe

sudo killall -HUP mDNSResponder

Mac OS X Schneeleopard

sudo dscacheutil -flushcache
haynzz
quelle
1

Lokale Firewall / Antivirus oder NGIPS ( Cisco Bluecoat ). Letzteres war mein Fall, in dem ich nicht einmal Protokolle in CloudWatch von meiner API erhalten würde. Es erlaubte meiner Domain-gehosteten Top-Level-Website, blockierte jedoch mit 403 die apiSubdomain, ohne dass sich auf der Registerkarte "Netzwerk-Entwickler-Tools" des Browsers ein Text befand.

Radu
quelle
1

Ich habe {"message":"Forbidden"}eine API mit EndpointConfiguration auf PRIVATE gesetzt und einen VpcEndpoint dafür in den privaten Subnetzen des Vpc erstellt (dies ist eine Inter-Service-API).

Der Grund, den ich bekam, {"message":"Forbidden"}war, dass ich den Eindruck hatte, ich sollte eine der URLs des VpcEndpoint verwenden. Die zu verwendende URL ist immer noch die mit der Bühne verknüpfte (in der ApiGateway-Konsole). Es ist:

https://${RestApiId}.execute-api.${Region}.amazonaws.com/${StageName}

Adriaan Pelzer
quelle
0

Wir hatten dieses Problem in unserer Produktion, als wir Kong als API-Gateway verwendeten. Unsere Anfragen gingen durch, als sie von Postman initiiert wurden, gingen jedoch mit 403 fehl, wenn sie über Code initiiert wurden. Das Bot-Plugin in Kong wurde aktiviert, das nur Anforderungen zuließ, die vom Browser oder der mobilen App basierend auf dem Headerwert des Benutzeragenten initiiert wurden. Unsere über den HTTP-Client initiierten Anforderungen sind fehlgeschlagen. Sobald wir das Bot-Plugin deaktiviert haben, ist der Fehler nicht aufgetreten. Es ermöglicht jetzt die Anforderung, ob der Benutzeragent Apache-HttpClient / 4.5.2 (Java / 1.8.0_91) ist.

Cshah
quelle
0

Ich bringe meine Erfahrung auch hier ein. Ich habe all diese Dinge oben ausprobiert und es stellte sich heraus, dass das Setzen der Domain mit einem Platzhalter mein {"message": "Forbidden"} -Problem gelöst hat : * .mydomain.com

Benutzerdefinierten Domain

Joel
quelle
0

Nur eine Anmerkung zu dem ähnlichen Fall, auf den ich mit Swagger Editor gestoßen bin:

  • Ich habe die OpenAPI 3.0 YAML von API Gateway exportiert → Stufen → "Prod" auswählen → Registerkarte "Exportieren" auswählen → Radiobutton auf "OpenAPI 3" umschalten → "Als OpenAPI 3 + API Gateway-Erweiterungen exportieren"
  • Fügen Sie die empfangene YAML in https://editor.swagger.io/ ein.
  • Führen Sie eine einfache GET-Methode aus.
  • Es kehrt 403 Forbiddenmit dem {"message":"Forbidden"}Körper zurück.

curl Der Befehl von Swagger Editor sah folgendermaßen aus:

curl -X GET "https://xxx52xxxx9.execute-api.eu-central-1.amazonaws.com//Prod/users" -H "accept: application/json"

(Beachten Sie das Doppel //vor Prod).

Und der gleiche curlBefehl ohne //über die Kommandozeile funktioniert!

Der Trick, der funktioniert hat, besteht darin, diese serverin dem vom API-Gateway generierten Struktur zurückgegebene Struktur zu ersetzen :

servers:
  - url: "https://xxx52xxxx9.execute-api.eu-central-1.amazonaws.com/{basePath}"
    variables:
      basePath:
        default: "/Prod"

Mit dem vollen urlohne variables:

servers:
  - url: "https://xxx52xxxx9.execute-api.eu-central-1.amazonaws.com/Prod"

Insbesondere hat das Entfernen des führenden Schrägstrichs default: "/Prod"nicht geholfen.

Dmitriy Popov
quelle
0

In meinem Fall war der API-Schlüssel nicht aktiviert. Stellen Sie sicher, dass die API als Aktiviert festgelegt ist. Geben Sie hier die Bildbeschreibung ein

Quentin Del
quelle
0

Wie @ gary69 und @Adriaan Pelzer erwähnen

https://stackoverflow.com/a/52727654/809043

https://stackoverflow.com/a/55136675/809043

Sie können die Nachricht {"message": "Forbidden"} erhalten, wenn Sie eine private API anfordern.

Wenn Sie also ein Setup haben, bei dem der gesamte Datenverkehr über einen API-Endpunkt geleitet werden soll, der den Datenverkehr dann an das API-Gateway weiterleitet, können die folgenden Parameter verwendet werden.

APIGatewayVPCEndpoint:
  Type: 'AWS::EC2::VPCEndpoint'
  Properties:
    PolicyDocument: '{
        "Version":"2012-10-17",
        "Statement":[{
          "Effect":"Allow",
          "Principal": "*",
          "Action":["execute-api:Invoke"],
          "Resource":["arn:aws:execute-api:eu-north-1:000000000000:*/*"]
        }]
      }'
  ...
  VpcEndpointType: Interface
  PrivateDnsEnabled: true

Wenn PrivateDnsEnabled aktiviert ist, muss der Endpunkt im API-Gateway vom Typ Privat sein und eine Richtlinie muss hinzugefügt werden.

  ApiGatewayRest:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Description: A mocked API
      Name: Mocked API
      EndpointConfiguration:
        Types:
          - PRIVATE
      Policy: '{
        "Version": "2012-10-17",
        "Statement": [{
          "Effect": "Allow",
          "Principal": "*",
          "Action": "execute-api:Invoke",
          "Resource": "arn:aws:execute-api:eu-north-1:000000000000:*/*/*/*"
        }]
      }'

Dieser Forenthread hat mir geholfen, einige Details zu klären

https://forums.aws.amazon.com/thread.jspa?threadID=286760

Leonard Saers
quelle