Uwaga dotycząca modów : To pytanie dotyczy tego, dlaczego Postman nie podlega ograniczeniom CORS w taki sam sposób, jak XMLHttpRequest. To pytanie nie dotyczy sposobu naprawienia błędu „Brak kontroli dostępu - zezwolenia na pochodzenie”….
Przestań publikować :
- Konfiguracje CORS dla każdego języka / struktury pod słońcem. Zamiast tego znajdź pytanie dotyczące odpowiedniego języka / frameworka .
- Usługi stron trzecich, które umożliwiają żądanie obejścia CORS
- Opcje wiersza poleceń do wyłączania CORS dla różnych przeglądarek
Próbuję zrobić autoryzację za pomocą JavaScript , łącząc się z relaksującego API wbudowane w kolbie . Jednak po złożeniu żądania pojawia się następujący błąd:
XMLHttpRequest nie może załadować http: // myApiUrl / login . Żądany zasób nie zawiera nagłówka „Access-Control-Allow-Origin”. Dostęp „null” pochodzenia nie jest zatem dozwolony.
Wiem, że interfejs API lub zdalny zasób musi ustawić nagłówek, ale dlaczego zadziałało, gdy wysłałem żądanie za pośrednictwem rozszerzenia Postman do przeglądarki Chrome ?
To jest kod żądania:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
Odpowiedzi:
Jeśli dobrze to zrozumiałem, wykonujesz XMLHttpRequest w innej domenie niż Twoja strona. Dlatego przeglądarka go blokuje, ponieważ zwykle ze względów bezpieczeństwa zezwala na żądanie tego samego źródła. Musisz zrobić coś innego, jeśli chcesz wykonać żądanie między domenami. Samouczek na temat tego, jak to osiągnąć, to Korzystanie z CORS .
Gdy korzystasz z listonosza, nie podlegają one tym zasadom. Cytat z Cross-Origin XMLHttpRequest :
źródło
Rozwiązanie tego problemu jest bardzo proste, jeśli używasz PHP . Wystarczy dodać następujący skrypt na początku strony PHP, która obsługuje żądanie:
Jeśli używasz Node-red , musisz zezwolić na CORS w
node-red/settings.js
pliku , odznaczając następujące linie:Jeśli używasz Flask tak samo jak pytanie; musisz najpierw zainstalować
flask-cors
Następnie dołącz aplikację Flask cors do swojej aplikacji.
Prosta aplikacja będzie wyglądać następująco:
Aby uzyskać więcej informacji, możesz sprawdzić dokumentację Flask .
źródło
Ponieważ
$ .ajax ({type: „POST” - wywołuje OPCJE
$ .post ( - wywołuje POST
Oba są różne. Listonosz poprawnie nazywa „POST”, ale kiedy go nazwiemy, będzie to „OPCJE”.
W przypadku usług internetowych C # - Web API
Dodaj następujący kod do pliku web.config pod znacznikiem <system.webServer>. To zadziała:
Upewnij się, że nie popełnisz błędu w wywołaniu Ajax
jQuery
Uwaga: jeśli szukasz pobierania treści ze strony internetowej innej firmy, to ci to nie pomoże . Możesz wypróbować następujący kod, ale nie JavaScript.
źródło
*
używaćhttps://www.myotherdomain.com
Stosowanie ograniczenia CORS jest funkcją bezpieczeństwa zdefiniowaną przez serwer i wdrożoną przez przeglądarkę .
Jednak narzędzie Postman nie przejmuje się polityką CORS serwera.
Dlatego błąd CORS pojawia się w przeglądarce, ale nie w Listonoszu.
źródło
W poniższym dochodzeniu jako API używam http://example.com zamiast http: // myApiUrl / login z twojego pytania, ponieważ to pierwsze działa.
Zakładam, że twoja strona jest na http: //my-site.local: 8088 .
Powodem, dla którego widzisz różne wyniki, jest to, że Listonosz:
Host=example.com
(twój API)Origin
Jest to podobne do sposobu wysyłania żądań przez przeglądarkę, gdy witryna i interfejs API mają tę samą domenę (przeglądarki również ustawiają element nagłówka
Referer=http://my-site.local:8088
, ale nie widzę go w Listonoszu). GdyOrigin
nagłówek nie jest ustawiony, zazwyczaj serwery domyślnie dopuszczają takie żądania.Jest to standardowy sposób, w jaki Listonosz wysyła żądania. Ale przeglądarka wysyła żądania inaczej, gdy witryna i interfejs API mają różne domeny , a następnie występuje CORS i przeglądarka automatycznie:
Host=example.com
(twój jako API)Origin=http://my-site.local:8088
(twoja strona)(Nagłówek
Referer
ma taką samą wartość jakOrigin
). A teraz na karcie Konsola i sieci Chrome zobaczysz:Gdy masz
Host != Origin
to CORS, a gdy serwer wykryje takie żądanie, zwykle domyślnie je blokuje .Origin=null
jest ustawiany po otwarciu treści HTML z katalogu lokalnego i wysyła żądanie. Ta sama sytuacja ma miejsce, gdy wysyłasz żądanie wewnątrz<iframe>
, jak w poniższym fragmencie (ale tutajHost
nagłówek wcale nie jest ustawiony) - ogólnie rzecz biorąc, wszędzie tam, gdzie specyfikacja HTML mówi nieprzejrzyste pochodzenie, możesz to przetłumaczyćOrigin=null
. Więcej informacji na ten temat można znaleźć tutaj .Jeśli nie korzystasz z prostego żądania CORS, zazwyczaj przeglądarka automatycznie wysyła również żądanie OPTIONS przed wysłaniem żądania głównego - więcej informacji tutaj . Poniższy fragment pokazuje to:
Możesz zmienić konfigurację swojego serwera, aby zezwolić na żądania CORS.
Oto przykładowa konfiguracja, która włącza CORS na nginx (plik nginx.conf) - bądź bardzo ostrożny z ustawieniami
always/"$http_origin"
dla nginx i"*"
Apache - spowoduje to odblokowanie CORS z dowolnej domeny.Pokaż fragment kodu
Oto przykładowa konfiguracja, która włącza CORS na Apache (plik .htaccess)
Pokaż fragment kodu
źródło
Wystąpił ten sam błąd w innym przypadku użycia.
Przypadek użycia: w chromie, gdy próbowano wywołać punkt końcowy REST sprężyny pod kątem.
Rozwiązanie: Dodaj adnotację @CrossOrigin („*”) nad odpowiednią klasą kontrolera.
źródło
Jeśli używasz platformy .NET jako warstwy środkowej, sprawdź wyraźnie atrybut route, na przykład
Miałem problem, kiedy tak było,
Naprawiono to przez,
źródło
Tylko dla projektu .NET Core Web API dodaj następujące zmiany:
services.AddMvc()
wierszu wConfigureServices()
metodzie pliku Startup.cs:app.UseMvc()
wierszu wConfigure()
metodzie pliku Startup.cs:źródło