2012-05-11 14 views
22

estoy recibiendo el siguiente error cuando se utiliza ApiKeyAuthentication para mis recursos Tastypie cuando intento hacer una petición HTTP usando AJAX y Tastypie:'Autorización campo de encabezado de solicitud no está permitido' error - 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. 

Todas las ideas sobre cómo resolver esto?

Éstos son los encabezados de la solicitud de 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 

Aquí están las cabeceras de respuesta desde 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 

Como se puede ver, los dos tienen cabeceras de autorización, pero la autorización no lo hace trabajo.

Aquí es el middleware de Django que estoy usando para editar las cabeceras de respuesta: https://gist.github.com/1164697

Editar: me di cuenta del problema. Estaba intentando conectarme a www.domain.com, y solo acepta domain.com

Respuesta

4

Esto ocurre debido a Same origin policy.

Debe realizar una llamada AJAX desde el mismo dominio donde se envía la solicitud. O realice cambios en el servidor, permitiendo solicitudes desde dominios externos.

Para resolver esto es necesario hacer cambios en los encabezados en http://domain.com al permitir que su dominio externo en los encabezados:

Access-Control-Allow-Origin: * 

Leer more

+0

llamadas AJAX La provienen del mismo dominio. ¿Cómo podría realizar cambios en el servidor para permitir solicitudes de dominios externos y cuáles son los problemas de seguridad presentes al hacer esto? – egidra

+0

He actualizado mi respuesta – antyrat

+0

Agregué el siguiente encabezado a todas mis solicitudes ajax: 'Access-Control-Allow-Origin': '*'. Todavía recibo el mismo error: campo de encabezado de solicitud Autorización no permitida por Access-Control-Allow-Headers. – egidra

0

El problema fue que www.domain.com fue visto como diferente que domain.com. domain.com funcionó, pero cuando utilicé www.domain.com, me detectó como que hacía solicitudes de un dominio diferente

+3

Probablemente debería marcar la respuesta de Antyrat como correcta. Es más detallado, proporciona enlaces, fue escrito antes, y es ... ya sabes ... correcto. – Martin

50

La respuesta de Antyrat no está completa.

Debe especificar qué encabezados permite su servidor; en su caso Autorización.

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

Muchas gracias. Me gustaría añadir que fui un poco "flojo" y he tratado de usar "Access-Control-Allow-Headers: *", y no funcionó, pero con "Authorization" funcionó. –

+2

Lo mismo aquí, '*' no funciona pero la Autorización no – GoatInTheMachine

2

A pesar de que la respuesta de upvoted @Manuel Bitto,
me gustaría publicar otra respuesta que contiene una completa Filtro Cors que me funciona 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); 
    } 
} 

Sugeriría específicamente prestar atención a la adición de OPTIONS a los valores de encabezado "Access-Control-Allow-Methods".
La razón para hacerlo es que según la explicación proporcionada here por Mozilla,
si su solicitud (digamos POST) contiene un encabezado especial, o tipo de contenido (y este es mi caso), entonces el objeto XMLHttpRequest generará una llamada OPTIONS adicional, que debe abordar en su código.
Espero que esto ayude.

0

Sé que esta pregunta es anterior.

Pero hoy encontré el mismo problema de cors después de agregar owin. Después del número de búsqueda en google y probando varias soluciones. Resolví problema de cors agregando a continuación

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

Para obtener más información, siga los enlaces a continuación. Gracias.

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

Cuestiones relacionadas