Jeg forsøger at foretage autorisation ved hjælp af JavaScript ved at oprette forbindelse til RESTful API indbygget i Flask. Men når jeg foretager anmodningen, får jeg følgende fejl:
XMLHttpRequest cannot load http://myApiUrl/login. Der er ingen 'Access-Control-Allow-Origin' header til stede på den anmodede ressource. Origin 'null' er derfor ikke tilladt adgang.
Jeg ved, at API'et eller fjernressourcen skal indstille headeren, men hvorfor virkede det, da jeg lavede anmodningen via Chrome-udvidelsen Postman?
Dette er anmodningskoden:
$.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);
});
Hvis jeg har forstået det rigtigt, laver du en XMLHttpRequest til et andet domæne end det, din side er på. Så browseren blokerer den, da den normalt tillader en forespørgsel i den samme oprindelse af sikkerhedshensyn. Du skal gøre noget andet, når du ønsker at lave en forespørgsel på tværs af domæner. En vejledning om, hvordan du opnår dette, er Using CORS.
Når du bruger postman, er de ikke begrænset af denne politik. Citeret fra Cross-Origin XMLHttpRequest:
Almindelige websider kan bruge XMLHttpRequest-objektet til at sende og modtage data fra fjernservere, men de er begrænset af den samme oprindelsespolitik. Udvidelser er ikke så begrænsede. En udvidelse kan tale med fjernservere uden for dens oprindelse, så længe den først anmoder om tilladelser på tværs af oprindelsen.
Hvis du kan håndtere JSON til gengæld, så prøv at bruge JSONP (bemærk P i slutningen) til at tale mellem domæner:
$.ajax({
type: "POST",
dataType: 'jsonp',
...... etc ......
Få mere at vide om at arbejde med JSONP her:
Fremkomsten af JSONP - i bund og grund et konsensuelt cross-site scripting hack - har åbnet døren for kraftfulde mashups af indhold. Mange prominente websteder tilbyder JSONP-tjenester, så du kan få adgang til deres indhold via et foruddefineret API.
Der er et problem på tværs af domæner ved brug af Ajax. Du skal være sikker på, at du tilgår dine filer på den samme http://
-sti uden www.
(eller tilgå fra http://www.
og skrive til den samme sti inklusive www.
), som browseren betragter som et andet domæne, når den tilgår via en www.
-sti, så du kan se, hvor problemet ligger. Du sender til et andet domæne, og browseren blokerer for strømmen på grund af problemet med oprindelse.
Hvis API ikke er placeret på den samme vært som den, du anmoder fra, blokeres flowet, og du skal finde en anden måde at kommunikere med API'et på.