Jag försöker göra auktorisering med hjälp av JavaScript genom att ansluta till RESTful API som är inbyggt i Flask. När jag gör begäran får jag dock följande fel:
XMLHttpRequest cannot load http://myApiUrl/login. Ingen 'Access-Control-Allow-Origin' header finns på den begärda resursen. Origin 'null' är därför inte tillåtet att komma åt.
Jag vet att API:et eller fjärrresursen måste ställa in huvudet, men varför fungerade det när jag gjorde begäran via Chrome-tillägget Postman?
Detta är förfrågningskoden:
$.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);
});
Om jag har förstått det rätt gör du en XMLHttpRequest till en annan domän än den som din sida ligger på. Så webbläsaren blockerar den eftersom den av säkerhetsskäl vanligtvis tillåter en begäran i samma ursprung. Du måste göra något annat när du vill göra en förfrågan över en annan domän. En handledning om hur man gör det är Using CORS.
När du använder postman begränsas de inte av denna policy. Citat från Cross-Origin XMLHttpRequest:
Vanliga webbsidor kan använda XMLHttpRequest-objektet för att skicka och ta emot data från fjärrservrar, men de begränsas av samma ursprungspolicy. Utvidgningarna är inte lika begränsade. Ett tillägg kan prata med fjärrservrar utanför sitt ursprung, så länge det först begär behörigheter som sträcker sig över flera ursprung.
Om du kan hantera JSON i gengäld kan du försöka använda JSONP (observera P i slutet) för att tala mellan domäner:
$.ajax({
type: "POST",
dataType: 'jsonp',
...... etc ......
Lär dig mer om hur du arbetar med JSONP här:
JSONP - i huvudsak ett konsensusbaserat hack för skripting mellan olika webbplatser - har öppnat dörren för kraftfulla innehållsmixar. Många framstående webbplatser tillhandahåller JSONP-tjänster som ger dig tillgång till deras innehåll via ett fördefinierat API.
Det finns ett problem med Ajax på flera domäner. Du måste vara säker på att du får åtkomst till dina filer på samma sökväg http://
utan www.
(eller åtkomst från http://www.
och posta till samma sökväg inklusive www.
) som webbläsaren betraktar som en annan domän när du får åtkomst via en www.
-sökväg, så att du kan se var problemet ligger. Du skriver till en annan domän och webbläsaren blockerar flödet på grund av ursprungsproblemet.
Om API inte är placerad på samma värd som du begär från blockeras flödet och du måste hitta ett annat sätt att kommunicera med API:et.