Yritän tehdä valtuutuksen käyttäen JavaScript yhdistämällä RESTful API rakennettu Flask. Kun teen pyynnön, saan kuitenkin seuraavan virheilmoituksen:
XMLHttpRequest cannot load http://myApiUrl/login. Pyydetyssä resurssissa ei ole 'Access-Control-Allow-Origin' -otsikkoa. Origin 'null' ei siis ole sallittu pääsy.
Tiedän, että API:n tai etäresurssin on asetettava otsikko, mutta miksi se toimi, kun tein pyynnön Chrome-laajennuksen Postman kautta?
Tämä on pyynnön koodi:
$.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);
});
Jos ymmärsin oikein, teet XMLHttpRequest eri verkkotunnukselle kuin missä sivusi on. Selain siis estää sen, koska se yleensä sallii pyynnön samasta alkuperästä turvallisuussyistä. Sinun on tehtävä jotain erilaista, kun haluat tehdä verkkotunnusten välisen pyynnön. Ohje siitä, miten se onnistuu, on CORS:n käyttäminen.
Kun käytät postmania, niitä ei rajoiteta tällä käytännöllä. Lainaus lähteestä Cross-Origin XMLHttpRequest:
Tavalliset verkkosivut voivat käyttää XMLHttpRequest-objektia tietojen lähettämiseen ja vastaanottamiseen etäpalvelimilta, mutta niitä rajoittaa sama alkuperäkäytäntö. Laajennukset eivät ole niin rajoitettuja. Laajennus voi puhua etäpalvelimille alkuperänsä ulkopuolella, kunhan se ensin pyytää alkuperän ylittäviä oikeuksia.
Jos pystyt käsittelemään JSON:tä, kokeile käyttää JSONP:ta (huomaa P lopussa) verkkotunnusten väliseen keskusteluun:
$.ajax({
type: "POST",
dataType: 'jsonp',
...... etc ......
Lue lisää JSONP:n kanssa työskentelystä täällä:
JSONP:n - joka on pohjimmiltaan yksimielinen cross-site scripting hack - on avannut oven tehokkaille sisällön sekoituksille. Monet tunnetut sivustot tarjoavat JSONP-palveluja, joiden avulla voit käyttää niiden sisältöä ennalta määritellyn API:n kautta.
Ajaxin käyttö on domainien välinen ongelma. Sinun on oltava varma, että käytät tiedostojasi samassa http://
-polussa ilman www.
(tai käytä http://www.
ja lähetä samaan polkuun sisältäen www.
), jota selain pitää toisena verkkotunnuksena, kun käytät www.
-polkua, joten näet, missä ongelma on. Lähetät viestin eri verkkotunnukseen, ja selain estää viestin kulun alkuperään liittyvän ongelman vuoksi.
Jos API ei sijaitse samalla isäntäkoneella, jolta pyydät, virtaus estetään, ja sinun on löydettävä toinen tapa kommunikoida API:n kanssa.