Brak tokenu uwierzytelniania podczas uzyskiwania dostępu do API Gateway?


85

Próbuję wywołać funkcję Lambda przez AWS API Gateway. Kiedy wspominam o typie uwierzytelnienia NONE, działa dobrze, ale API staje się publiczne i każdy z adresem URL może uzyskać dostęp do mojego API. Aby zabezpieczyć wywołanie API, używam typu uwierzytelniania AWS_IAM, a także dołączam zasadę AmazonAPIGatewayInvokeFullAccess do mojego użytkownika, ale otrzymuję ten błąd:

{ message: "Missing Authentication Token"}

Nie wiem, czego tu brakuje.


Uważam, że większość, jeśli nie wszystkie odpowiedzi tutaj, działałyby również dla każdej innej usługi AWS (tj .: także DynamoDB) odwzorowanej za danym punktem końcowym zasobu API Gateway. Zakładając, że to prawda, interfejsem operacyjnym jest API Gateway (a nie zasób usługi AWS).
cellepo

Błąd jest wynikiem trafienia w niewłaściwy punkt końcowy
Rexben

Odpowiedzi:


45

Myślę, że próbujesz bezpośrednio uzyskać dostęp do łącza API, to nie zadziała, ponieważ API jest zabezpieczone za pomocą roli IAM i musisz zapewnić uwierzytelnianie AWS, tj. Klucz dostępu i klucz tajny.

Użyj rozszerzenia Postman do przeglądarki Chrome, aby przetestować swój interfejs API: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


Cześć Saddam, Jak można przeprowadzić uwierzytelnianie AWS w interfejsie SOAP. W POSTMAN jest to bardzo łatwe. Czy mamy podobny sposób w SOAP UI?
Pankaj Sharma

172

Straciłem trochę czasu z głupiego powodu:

Podczas tworzenia etapu wyświetlane łącze nie zawiera części adresu URL zawierającej zasoby:

URL API: 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

Plik / get-list zaginął

I oczywiście musisz sprawdzić, czy konfiguracja metody wygląda następująco:

wprowadź opis obrazu tutaj


14
Za przyznanie się do głupich (ale powszechnych) przyczyn problemu wymagane są specjalne wyrazy uznania. To też mnie dopadło.
Jeff Richards

Przepraszam, nie rozumiem, co masz na myśli, jeśli chcesz sprawdzić, czy żądanie wpisu jest skonfigurowane do korzystania z uwierzytelniania, musisz kliknąć opcję POST pod utworzonym zasobem, na przykład możesz mieć / my- po wywołaniu w swoich zasobach, a pod nim masz metody OPTION i POST. Kliknij POST, a następnie w konfiguracji metody możesz sprawdzić, czy uwierzytelnianie jest wymagane. Ale jeśli chcesz uzyskać pełny adres URL do wywołania pocztowego, działa to tak samo, jak adres URL get API + RESOURCE, na przykład 1111.execute-api.us-east-1.amazonaws.com/dev/my- pos-tcall
Carlos Alberto Schneider

2
Powiązana, głupia rzecz, która mnie zaskoczyła: upewnij się, że twój czasownik HTTP jest poprawny. Przez pomyłkę wysyłałem GET zamiast POST. Wygląda na to, że ten błąd wystąpi na każdej trasie, która nie jest dokładnie dopasowana zarówno pod względem ścieżki, jak i czasownika.
Josh1billion

Wielkie dzięki !! To takie proste, kiedy o tym wspomniałeś. Nie zdawałem sobie sprawy. Dziękuje!
ylev

FWIW, klikając najpierw sam zasób (w tym przypadku GET) w drzewie etapów, które moim zdaniem powinno ujawnić pełny adres URL bezpośrednio dla tego zasobu. Więcej szczegółów i zdjęcie wyjaśniające w mojej powiązanej odpowiedzi: stackoverflow.com/a/60858537/1357094
cellepo

21

Właśnie miałem ten sam problem i wygląda na to, że pokazuje również ten komunikat, jeśli nie można znaleźć zasobu.

W moim przypadku zaktualizowałem API, ale zapomniałem wdrożyć ponownie. Problem został rozwiązany po wdrożeniu zaktualizowanego interfejsu API na moim etapie.


W ten sposób doprowadziłem to do pracy. Ponownie wdrożono zasób !.
KQI

8

Wygląda na to, że (od kwietnia 2019 r.) AWS API Gateway zgłasza ten wyjątek z różnych powodów - głównie wtedy, gdy trafiasz na punkt końcowy, do którego API Gateway nie jest w stanie dotrzeć, albo dlatego, że nie został wdrożony, albo też w przypadkach, Metoda HTTP nie jest obsługiwana.

Chciałbym, żeby bramka wysyłała bardziej odpowiednie kody błędów, takie jak metoda HTTP 405 nie jest obsługiwana lub nie znaleziono protokołu HTTP 404, zamiast ogólnego HTTP 403 zabroniony.


8

Upewnij się, że najpierw klikasz określony zasób w drzewie etapów, ponieważ spowoduje to wypełnienie adresu URL pełną ścieżką do zasobu (a nie tylko ścieżką główną): wprowadź opis obrazu tutaj

W przypadku innych przyczyn zobacz http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/


czy mógłbyś
rzucić

@sumanthshetty, czy wypróbowałeś to rozwiązanie lub dowolną z pozostałych odpowiedzi tutaj? A może przeczytałeś link AWS stąd?
cellepo

Wypróbowałem wszystkie odpowiedzi stąd, a także artykuł
sumanth shetty

6

Upewnij się, że utworzyłeś zasób, a następnie utwórz w nim metodę. To był problem dla mnie. Dzięki

wprowadź opis obrazu tutaj


5

Znalazłem to w dokumentach:

W przypadku użycia autoryzacji AWS_IAM wniosek podpisałbyś przy użyciu protokołów Signature Version 4.

Żądanie podpisania podpisem w wersji 4


Możesz również wygenerować SDK dla swojego interfejsu API.

Jak wygenerować zestaw SDK dla interfejsu API w bramie interfejsu API

Po wygenerowaniu zestawu SDK dla wybranej platformy w kroku 6 wspomniano, że jeśli używasz poświadczeń AWS, żądanie do interfejsu API zostanie podpisane:

  1. Aby zainicjować zestaw SDK wygenerowany przez API Gateway z poświadczeniami AWS, użyj kodu podobnego do poniższego. Jeśli używasz poświadczeń AWS, wszystkie żądania do API zostaną podpisane. Oznacza to, że musisz ustawić odpowiednie nagłówki CORS Accept dla każdego żądania:

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

4

Jeśli włączysz uwierzytelnianie AWS_IAM, musisz podpisać swoje żądanie danymi uwierzytelniającymi AWS przy użyciu AWS Signature Version 4 .

Uwaga : zalogowanie się do konsoli AWS nie powoduje automatycznego podpisania żądań przeglądarki w interfejsie API.


3

czasami ten komunikat jest wyświetlany, gdy wywołujesz niewłaściwy interfejs API

sprawdź punkt końcowy interfejsu API


2

Próbuję wszystkich powyższych, jeśli wykonałeś wszystkie kroki w powyższych odpowiedziach i nie rozwiązałeś problemu, to:

  1. w menu po lewej stronie kliknij „Zasoby”
  2. po prawej stronie „Zasoby” kliknij metodę interfejsu API, którą chcesz przetestować, np. „POST / GET itp.)
  3. kliknij listę „ACTION” (jest powyżej metody API w kroku 2
  4. wybierz „DEPLOY API” (zrób to, nawet jeśli już wdrożyłeś swoje API)
  5. w „etapie wdrażania” wybierz „produkt” lub cokolwiek napiszesz w poprzednim wdrożeniu (zastąpi to poprzednie wdrożenie
  6. hit wdrożyć

Wydaje mi się, że gdy tworzę "ŻĄDANIE METODY" (patrz krok 2 jak przejść do tego menu), w "Autoryzacji" po przetestowaniu api wybieram "AWS_IAM", w opcji test aws próbuję to w "listonoszu „wtedy rozumiem, że w„ PROŚBA O METODĘ ”, w„ Autoryzacji ”powinienem wybrać„ brak ”

Zmieniam to na żadne, ale myślę, że AWS, muszę go ponownie wdrożyć, jak wyjaśniam


1

Ten błąd pojawia się najczęściej, gdy wywołujesz niewłaściwy punkt końcowy interfejsu API. Sprawdź punkt końcowy interfejsu API, do którego dzwonisz, i zweryfikuj to w bramie interfejsu API.


1

Jeśli używasz interfejsu API z punktem końcowym typu PRIVATE , upewnij się, że:

  1. Wywołujesz API z konta AWS (przykład: z instancji EC2 utworzonej na Twoim koncie)

  2. Umieść niezbędne poświadczenia (dostęp i tajne klucze) w instancji EC2 w route ~ / .aws / credentials (ta trasa jest dla instancji linux) Jeśli użytkownik IAM używa MFA, wartość aws_session_token będzie również wymagana.

  3. Użyj adresu URL opartego na vpce (punkt końcowy vpc). Przykład: curl https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status

  4. Twoja instancja EC2 ma grupę bezpieczeństwa, która zezwala na ruch wychodzący do innej grupy bezpieczeństwa należącej do VPN, na przykład: Instancja EC2 sg

  5. Twoja grupa bezpieczeństwa vpce zezwala na ruch przychodzący z innej grupy zabezpieczeń (poprzednia sg z instancji ec2) należącej do instancji EC2, takiej jak: vpce sg

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


1

W moim przypadku to była całkiem głupia rzecz. Przyzwyczaiłem się, że nowe jednostki są tworzone za pomocą POST i kończyło się to błędem z „Brakującym tokenem uwierzytelniania”. Brakowało mi tego z jakiegoś powodu, który został zdefiniowany jako PUT, który działa dobrze.


0

Przede wszystkim sprawdź, czy API utworzone w funkcji lamda jest zarejestrowane w Twoim projekcie AWS, czy nie. W tym celu przejdź do bramy API w konsoli AWS. Jeśli nie jest zarejestrowany, zarejestruj go. To jest główna przyczyna tego problemu.

Możesz nawet zobaczyć w swoim pliku aws.export.js , że istnieją ścieżki odpowiadające Twojemu API ['/items'].

Twoje API musi tam być obecne, w przeciwnym razie nie będzie dołączać tokena bezpieczeństwa do żądań. Po prostu zarejestruj go w swojej logice projektu w swojej konsoli.

Jeśli tam jest, skorzystaj z wyżej wymienionego rozwiązania
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


0

W przypadku rekordu, jeśli nie używasz poświadczeń, ten błąd pojawia się również, gdy ustawiasz walidator żądań w metodzie POST / PUT na „waliduj treść, parametry ciągu zapytania i HEADERS” lub inną opcję „weryfikuj ciąg zapytania parametry i NAGŁÓWKI ”.... w takim przypadku będzie szukać referencji w nagłówku i odrzuci żądanie. Podsumowując, jeśli nie zamierzasz wysyłać poświadczeń i chcesz, aby były otwarte, nie powinieneś ustawiać tej opcji w walidatorze żądań (ustaw ją na NONE lub walidację treści)


0

Przyczynić się:

Wystąpił podobny błąd, ponieważ moja odpowiedź zwrotna nie zawierała „treści” w ten sposób:

return {'statusCode': 200, 'body': "musi zawierać tag body, jeśli zastąpisz go, nie zadziała"}


0

Miałem ten sam problem, który rozwiązałem w następujący sposób:

POBIERZ Test metody

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

0

Jeśli skonfigurujesz rolę IAM dla swojego serwera, który ma uprawnienie AmazonAPIGatewayInvokeFullAccess, nadal musisz przekazywać nagłówki w każdym żądaniu. Możesz to zrobić w Pythonie za pomocą biblioteki aws-request-auth w następujący sposób:

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

Cóż, dla każdego, kto nadal ma problem i po uświadomieniu sobie tego naprawdę czuję się bardzo głupio, ale przeszedłem w adresie URL /itemsdomyślnego podczas dodawania interfejsu API. Ale wciąż wywoływałem punkt końcowy z /api. Specjalne podziękowania dla Carlos Alberto Schneider, ponieważ zdałem sobie sprawę z mojego problemu po przeczytaniu twojego postu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.