Perché il mio codice JavaScript ottiene un "No 'Access-Control-Allow-Origin' header è presente sulla risorsa richiesta" errore quando Postman non lo fa?

Sto cercando di fare l'autorizzazione usando JavaScript collegandomi alla RESTful API costruita in Flask. Tuttavia, quando faccio la richiesta, ottengo il seguente errore:

XMLHttpRequest cannot load http://myApiUrl/login. No 'Access-Control-Allow-Origin'header è presente sulla risorsa richiesta. L'origine 'null' non è quindi permesso l'accesso.

So che l'API o la risorsa remota devono impostare l'intestazione, ma perché ha funzionato quando ho fatto la richiesta tramite l'estensione Chrome Postman?

Questo è il codice della richiesta:

$.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);
    });
Soluzione

Se ho capito bene stai facendo una XMLHttpRequest a un dominio diverso da quello della tua pagina. Quindi il browser lo sta bloccando perché di solito permette una richiesta nella stessa origine per motivi di sicurezza. Devi fare qualcosa di diverso quando vuoi fare una richiesta cross-domain. Un tutorial su come ottenere ciò è Using CORS.

Quando usate postman non sono limitati da questa politica. Citato da Cross-Origin XMLHttpRequest:

Le pagine web regolari possono usare l'oggetto XMLHttpRequest per inviare e ricevere dati da server remoti, ma sono limitate dalla stessa policy di origine. Le estensioni non sono così limitate. Un'estensione può parlare con server remoti al di fuori della sua origine, a patto che richieda prima i permessi cross-origin.

Commentari (15)

Se puoi trattare con JSON in cambio, allora prova a usare JSONP (nota la P alla fine) per parlare tra domini:

$.ajax({
  type: "POST",
  dataType: 'jsonp',
  ...... etc ......

Per saperne di più su come lavorare con JSONP qui: L'avvento di JSONP - essenzialmente un hack consensuale di cross-site scripting - ha aperto la porta a potenti mashup di contenuti. Molti siti importanti forniscono servizi JSONP, permettendoti di accedere al loro contenuto tramite un'API predefinita.

Commentari (9)

C'è un problema di dominio incrociato usando Ajax. Devi essere sicuro di accedere ai tuoi file sullo stesso percorso http:// senza www. (o accedere da http://www. e postare sullo stesso percorso includendo www.) che il browser considera come un altro dominio quando si accede tramite un percorso www., così vedi dove è il problema. Stai postando su un dominio diverso e il browser blocca il flusso a causa del problema dell'origine.

Se l'API non è posta sullo stesso host da cui stai richiedendo, il flusso viene bloccato e dovrai trovare un altro modo per comunicare con l'API.

Commentari (1)