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.
Odpowiedzi:
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
źródło
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:
źródło
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.
źródło
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.
źródło
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ą):
W przypadku innych przyczyn zobacz http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/
źródło
Upewnij się, że utworzyłeś zasób, a następnie utwórz w nim metodę. To był problem dla mnie. Dzięki
źródło
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:
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:
źródło
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.
źródło
czasami ten komunikat jest wyświetlany, gdy wywołujesz niewłaściwy interfejs API
sprawdź punkt końcowy interfejsu API
źródło
Próbuję wszystkich powyższych, jeśli wykonałeś wszystkie kroki w powyższych odpowiedziach i nie rozwiązałeś problemu, to:
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
źródło
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.
źródło
Jeśli używasz interfejsu API z punktem końcowym typu PRIVATE , upewnij się, że:
Wywołujesz API z konta AWS (przykład: z instancji EC2 utworzonej na Twoim koncie)
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.
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
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:
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:
Zobacz: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html
źródło
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.
źródło
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
źródło
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)
źródło
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"}
źródło
Miałem ten sam problem, który rozwiązałem w następujący sposób:
POBIERZ Test metody
źródło
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:
źródło
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
/items
domyślnego podczas dodawania interfejsu API. Ale wciąż wywoływałem punkt końcowy z/api
. Specjalne podziękowania dlaCarlos Alberto Schneider
, ponieważ zdałem sobie sprawę z mojego problemu po przeczytaniu twojego postu.źródło