Chociaż CORS został skonfigurowany za pośrednictwem API Gateway i ustawiono Access-Control-Allow-Origin
nagłówek, nadal otrzymuję następujący błąd podczas próby wywołania interfejsu API z AJAX w przeglądarce Chrome:
XMLHttpRequest nie może załadować http://XXXXX.execute-api.us-west-2.amazonaws.com/beta/YYYYY . Żądany zasób nie zawiera nagłówka „Access-Control-Allow-Origin”. W związku z tym źródło „null” nie ma dostępu. Odpowiedź miała kod stanu HTTP 403.
Próbowałem uzyskać adres URL przez Postman i pokazuje, że powyższy nagłówek został pomyślnie przekazany:
A z odpowiedzi OPCJE:
Jak mogę wywołać mój interfejs API z przeglądarki bez powrotu do JSON-P?
Bucket Policy
? Upewnij się, że masz metodę w swojej polityceOdpowiedzi:
Mam ten sam problem. Wykorzystałem 10 godzin, aby się dowiedzieć.
https://serverless.com/framework/docs/providers/aws/events/apigateway/
// handler.js 'use strict'; module.exports.hello = function(event, context, callback) { const response = { statusCode: 200, headers: { "Access-Control-Allow-Origin" : "*", // Required for CORS support to work "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS }, body: JSON.stringify({ "message": "Hello World!" }) }; callback(null, response); };
źródło
Jeśli ktoś jeszcze korzysta z tego nadal - udało mi się wyśledzić główną przyczynę w mojej aplikacji.
Jeśli korzystasz z API-Gateway z niestandardowymi autoryzatorami - API-Gateway odeśle 401 lub 403 z powrotem, zanim faktycznie trafi na twój serwer. Domyślnie - API-Gateway NIE jest skonfigurowane dla CORS podczas zwracania 4xx od niestandardowego autoryzatora.
Ponadto - jeśli zdarza się, że otrzymujesz kod stanu z
0
lub1
z żądania przechodzącego przez API Gateway, prawdopodobnie jest to twój problem.Aby to naprawić - w konfiguracji API Gateway przejdź do „Gateway Responses”, rozwiń „Default 4XX” i dodaj tam nagłówek konfiguracji CORS. to znaczy
Access-Control-Allow-Origin: '*'
Pamiętaj, aby ponownie wdrożyć swoją bramę - i voila!
źródło
aws apigateway update-gateway-response --rest-api-id "XXXXXXXXX" --response-type "DEFAULT_4XX" --patch-operations op="add",path="/responseParameters/gatewayresponse.header.Access-Control-Allow-Origin",value='"'"'*'"'"'
1) Musiałem zrobić to samo co @riseres i kilka innych zmian, oto moje nagłówki odpowiedzi:
headers: { 'Access-Control-Allow-Origin' : '*', 'Access-Control-Allow-Headers':'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token', 'Access-Control-Allow-Credentials' : true, 'Content-Type': 'application/json' }
2) I
Zgodnie z tą dokumentacją:
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
Gdy używasz serwera proxy dla funkcji lambda w konfiguracji bramy API, metody post lub get nie mają dodanych nagłówków, tylko opcje. Musisz to zrobić ręcznie w odpowiedzi (odpowiedź serwera lub lambda).
3) I
Poza tym musiałem wyłączyć opcję `` Wymagany klucz API '' w mojej metodzie wysyłania bramy API.
źródło
Jeśli wypróbowałeś wszystko w tym problemie bezskutecznie, skończysz tam, gdzie ja. Okazuje się, że istniejące wskazówki dotyczące konfiguracji CORS firmy Amazon działają dobrze ... po prostu pamiętaj o ponownym wdrożeniu ! Kreator edycji CORS, nawet ze wszystkimi ładnymi małymi zielonymi znacznikami, nie aktualizuje na żywo twojego API. Być może oczywiste, ale zszokowało mnie to na pół dnia.
źródło
Moja próbka działa: właśnie wstawiłem „Access-Control-Allow-Origin”: „*”, wewnątrz nagłówków: {} w wygenerowanej funkcji Lambda nodejs. Nie wprowadziłem żadnych zmian w warstwie API generowanej przez Lambda.
Oto mój NodeJS:
'use strict'; const doc = require('dynamodb-doc'); const dynamo = new doc.DynamoDB(); exports.handler = ( event, context, callback ) => { const done = ( err, res ) => callback( null, { statusCode: err ? '400' : '200', body: err ? err.message : JSON.stringify(res), headers:{ 'Access-Control-Allow-Origin' : '*' }, }); switch( event.httpMethod ) { ... } };
Oto moja rozmowa AJAX
$.ajax({ url: 'https://x.execute-api.x-x-x.amazonaws.com/prod/fnXx?TableName=x', type: 'GET', beforeSend: function(){ $( '#loader' ).show();}, success: function( res ) { alert( JSON.stringify(res) ); }, error:function(e){ alert('Lambda returned error\n\n' + e.responseText); }, complete:function(){ $('#loader').hide(); } });
źródło
Dla pracowników Google:
Oto dlaczego:
GET
/POST
bez plików cookie nie powoduje uruchomienia inspekcji wstępnejOPTIONS
metodę dla tej ścieżki, a następnie wyśleAllow-Origin
nagłówki przy użyciu fałszywych odpowiedzi, gdy wywoła użytkownikaOPTIONS
, aleGET
/POST
nie zostanieAllow-Origin
automatycznieAllow-Origin
nagłówkaOPTIONS
Podsumowując:
OPTIONS
będą automatycznie generowane przez API GatewayOPTIONS
są używane przez przeglądarkę tylko jako środek ostrożności do sprawdzenia możliwości CORS na ścieżceGET
/POST
źródło
Właśnie dodałem nagłówki do mojej odpowiedzi funkcji lambda i zadziałało to jak urok
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hey it works'), headers:{ 'Access-Control-Allow-Origin' : '*' } }; return response; };
źródło
Wewnątrz znalazłem proste rozwiązanie
API Gateway> Select your API endpoint> Select the method (w moim przypadku był to POST)
Teraz jest menu rozwijane DZIAŁANIA> Włącz CORS .. wybierz to.
Teraz ponownie wybierz listę rozwijaną CZYNNOŚCI> Wdróż API (wdróż go ponownie)
Zadziałało !
źródło
Zacząłem działać po tym, jak zdałem sobie sprawę, że autoryzator lambda zawodzi iz jakiegoś nieznanego powodu został przetłumaczony na błąd CORS. Prosta poprawka do mojego autoryzatora (i kilka testów autoryzacyjnych, które powinienem był dodać w pierwszej kolejności) i zadziałało. Dla mnie była wymagana akcja bramy API „Włącz CORS”. To dodało wszystkie nagłówki i inne ustawienia, których potrzebowałem w moim API.
źródło
Dla mnie odpowiedzią, która WRESZCIE DZIAŁAŁ, był komentarz Jamesa Shapiro z odpowiedzi Alexa R (druga pod względem popularności). Wpadłem w ten problem z bramą API w pierwszej kolejności, próbując uzyskać statyczną stronę internetową hostowaną w S3, aby użyć lambda do przetworzenia strony kontaktowej i wysłania wiadomości e-mail. Po prostu zaznaczenie [] Default 4XX naprawiło komunikat o błędzie.
źródło
Po zmianie funkcji lub kodu Wykonaj te dwa kroki.
Najpierw włącz CORS, a następnie wdrażaj interfejs API za każdym razem.
źródło
Wdrażanie kodu po włączeniu CORS dla obu
POST
iOPTIONS
działało dla mnie.źródło
Biegam
aws-serverless-express
, aw moim przypadku potrzebne do edycjisimple-proxy-api.yaml
.Przed skonfigurowaniem CORS-a po
https://example.com
prostu zamieniłem nazwę mojej witryny i ponownie wdrożyłem za pośrednictwemnpm run setup
, a także zaktualizowałem moją istniejącą lambdę / stos.#... /: #... method.response.header.Access-Control-Allow-Origin: "'https://example.com'" #... /{proxy+}: method.response.header.Access-Control-Allow-Origin: "'https://example.com'" #...
źródło
W moim przypadku, ponieważ używałem AWS_IAM jako metody autoryzacji dla API Gateway, musiałem przyznać mojej roli IAM uprawnienia do trafienia w punkt końcowy.
źródło
Inną główną przyczyną tego problemu może być różnica między protokołami HTTP / 1.1 i HTTP / 2.
Objaw: Niektórzy użytkownicy, nie wszyscy, zgłaszali wystąpienie błędu CORS podczas korzystania z naszego oprogramowania.
Problem:
Access-Control-Allow-Origin
nagłówek brakowało czasami .Kontekst: Mieliśmy Lambda na miejscu, przeznaczoną do obsługi
OPTIONS
żądań i odpowiadania z odpowiednimi nagłówkami CORS, takimi jakAccess-Control-Allow-Origin
dopasowywanie do białej listyOrigin
.Rozwiązanie: Brama interfejsu API wydaje się przekształcać wszystkie nagłówki na małe litery dla wywołań HTTP / 2, ale zachowuje wielkość liter w przypadku protokołu HTTP / 1.1. To spowodowało dostęp do
event.headers.origin
to niepowodzenie .Sprawdź, czy też masz ten problem:
Zakładając, że Twój interfejs API znajduje się pod adresem
https://api.example.com
, a interfejs użytkownika jest pod adresemhttps://www.example.com
. Używając CURL, wyślij żądanie za pomocą HTTP / 2:curl -v -X OPTIONS -H 'Origin: https://www.example.com' https://api.example.com
Wynik odpowiedzi powinien zawierać nagłówek:
< Access-Control-Allow-Origin: https://www.example.com
Powtórz ten sam krok, używając protokołu HTTP / 1.1 (lub z małym
Origin
nagłówkiem):curl -v -X OPTIONS --http1.1 -H 'Origin: https://www.example.com' https://api.example.com
Jeśli
Access-Control-Allow-Origin
brakuje nagłówka, możesz chcieć sprawdzić wielkość liter podczas czytaniaOrigin
nagłówka.źródło
Oprócz innych komentarzy, należy zwrócić uwagę na stan zwrócony z podstawowej integracji i czy dla tego statusu zostanie zwrócony nagłówek Access-Control-Allow-Origin.
Wykonanie czynności „Włącz CORS” powoduje ustawienie tylko 200 statusu. Jeśli masz inne punkty końcowe, np. 4xx i 5xx, musisz samodzielnie dodać nagłówek.
źródło
W moim przypadku po prostu wpisałem nieprawidłowy adres URL żądania pobrania. On
serverless.yml
można ustawićcors
natrue
:register-downloadable-client: handler: fetch-downloadable-client-data/register.register events: - http: path: register-downloadable-client method: post integration: lambda cors: true stage: ${self:custom.stage}
a następnie w module obsługi lambda wysyłasz nagłówki, ale jeśli wykonasz błędne żądanie pobierania na interfejsie użytkownika, nie otrzymasz tego nagłówka w odpowiedzi i otrzymasz ten błąd. Dlatego dokładnie sprawdź adres URL swojego żądania z przodu.
źródło
W Pythonie możesz to zrobić jak w poniższym kodzie:
{ "statusCode" : 200, 'headers': {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': "*" }, "body": json.dumps( { "temperature" : tempArray, "time": timeArray }) }
źródło