2012-05-11 11 views
22

sto ottenendo il seguente errore durante l'utilizzo di ApiKeyAuthentication per le mie risorse Tastypie quando provo a fare una richiesta HTTP utilizzando AJAX e Tastypie:'richiesta campo di intestazione di autorizzazione non è consentito' errore - Tastypie

XMLHttpRequest cannot load http://domain.com/api/v1/item/?format=json&username=popo&api_key=b83d21e2f8bd4952a53d0ce12a2314c0ffa031b1. Request header field Authorization is not allowed by Access-Control-Allow-Headers. 

Tutte le idee su come risolvere questo?

Qui ci sono le intestazioni di richiesta da Chrome:

Request Headersview source 

Accept:*/* 
Accept-Charset: 
ISO-8859-1,utf-8;q=0.7,*;q=0.3 

Accept-Encoding:gzip,deflate,sdch 

Accept-Language:en-US,en;q=0.8 

Access-Control-Request-Headers: 
origin, authorization, access-control-allow-origin, accept, access-control-allow-headers 

Access-Control-Request-Method: 
GET 

Ecco le intestazioni di risposta da Chrome:

Response Headersview source 

Access-Control-Allow-Headers: 
Origin,Content-Type,Accept,Authorization 

Access-Control-Allow-Methods: 
POST,GET,OPTIONS,PUT,DELETE 

Access-Control-Allow-Origin:* 

Connection:keep-alive 

Content-Length:0 
Content-Type: 
text/html; charset=utf-8 

Date:Fri, 11 May 2012 21:38:35 GMT 

Server:nginx 

Come si può vedere, entrambi hanno le intestazioni per l'autorizzazione, ma l'autorizzazione non lo fa lavoro.

Ecco il middleware Django che sto usando per modificare le intestazioni di risposta: https://gist.github.com/1164697

Edit: ho capito il problema. Stavo cercando di collegarmi a www.domain.com e accetta solo domain.com

risposta

4

Questo succede a causa di Same origin policy.

È necessario effettuare chiamate AJAX dallo stesso dominio in cui viene effettuata la richiesta. Oppure apportare modifiche sul lato server, consentendo richieste da domini esterni.

Per risolvere questo è necessario apportare modifiche nelle intestazioni a http://domain.com consentendo il tuo dominio esterno nelle intestazioni:

Access-Control-Allow-Origin: * 

Leggi more

+0

chiamate AJAX sono provenienti dallo stesso dominio. Come potrei apportare modifiche ai server side per consentire richieste da domini esterni e quali sono i problemi di sicurezza presenti in questo modo? – egidra

+0

Ho aggiornato la mia risposta – antyrat

+0

Ho aggiunto la seguente intestazione a tutte le mie richieste ajax: 'Access-Control-Allow-Origin': '*'. Ricevo ancora lo stesso errore: campo dell'intestazione della richiesta L'autorizzazione non è consentita da Access-Control-Allow-Headers. – egidra

0

Il problema era che www.domain.com è stato visto come diverso di domain.com. domain.com ha funzionato, ma quando ho usato www.domain.com, mi ha rilevato come fare richieste da un dominio diverso

+3

Probabilmente dovresti contrassegnare la risposta di Antyrat come corretta. È più dettagliato, fornisce collegamenti, è stato scritto prima, ed è ... lo sai ... corretto. – Martin

50

La risposta di Antyrat non è completa.

È necessario specificare le intestazioni consentite dal server; nel tuo caso Autorizzazione.

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE 
Access-Control-Allow-Headers: Authorization 
+2

Grazie mille. Vorrei aggiungere che ero un po '"pigro" e ho provato ad usare "Access-Control-Allow-Headers: *", e non ha funzionato, ma con "Autorizzazione" ha funzionato. –

+2

Lo stesso qui, '*' non funziona ma l'Autorizzazione non – GoatInTheMachine

2

Anche se ho upvoted la risposta di @Manuel Bitto,
Vorrei inviare un'altra risposta che contiene un filtro Cors completa che funziona per me con Apache Tomcat 5.x:

public class CorsFilter implements Filter { 

    public CorsFilter() { } 

    public void init(FilterConfig fConfig) throws ServletException { } 

    public void destroy() { } 

    public void doFilter(

      ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse httpServletResponse = (HttpServletResponse)response; 
     httpServletResponse.addHeader("Access-Control-Allow-Origin", "*"); 
     httpServletResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS, DELETE"); 
     httpServletResponse.addHeader("Access-Control-Allow-Headers", "Authorization"); 

     chain.doFilter(request, response); 
    } 
} 

Suggerirei di prestare particolare attenzione all'aggiunta di OPTIONS ai valori dell'intestazione "Access-Control-Allow-Methods".
Il motivo è che secondo la spiegazione fornita here da Mozilla,
se la richiesta (diciamo POST) contiene un'intestazione speciale o tipo di contenuto (e questo è il mio caso), quindi l'oggetto XMLHttpRequest genererà una chiamata OPTIONS aggiuntiva, che devi indirizzare nel tuo codice.
Spero che questo aiuti.

0

So che questa domanda è più vecchia.

Ma oggi mi sono imbattuto nello stesso numero di cors dopo aver aggiunto owin. Dopo il numero di ricerche su google e provando varie soluzioni. Ho risolto il problema cors aggiungendo sotto

<remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
<remove name="OPTIONSVerbHandler" /> 
<remove name="TRACEVerbHandler" /> 

Per ulteriori dettagli si prega di seguire i link qui sotto. Grazie.

[http://benfoster.io/blog/aspnet-webapi-cors]

Problemi correlati