web-dev-qa-db-fra.com

Erreur "L'autorisation du champ d'en-tête de demande n'est pas autorisée" - Tastypie

Le message d'erreur suivant s'affiche lorsque j'utilise ApiKeyAuthentication pour mes ressources Tastypie lorsque j'essaie d'effectuer une demande HTTP à l'aide de AJAX et de 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.

Des idées sur la façon de résoudre ceci?

Voici les en-têtes de requête 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

Voici les en-têtes de réponse de 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

Comme vous pouvez le constater, ils ont tous les deux un en-tête pour l'autorisation, mais l'autorisation ne fonctionne pas.

Voici le middleware Django que j'utilise pour modifier les en-têtes de réponse: https://Gist.github.com/1164697

Edit: J'ai compris le problème. J'essayais de me connecter à www.domain.com, et il n'accepte que domain.com

24
egidra

Cela est dû à la politique Même origine .

Vous devez appeler AJAX à partir du même domaine que la demande. Ou apportez des modifications côté serveur, autorisant les requêtes provenant de domaines externes.

Pour résoudre ce problème, vous devez modifier les en-têtes à l'adresse http://domain.com en autorisant votre domaine externe dans les en-têtes:

Access-Control-Allow-Origin: *

Lire plus

5
antyrat

La réponse d'Antyrat n'est pas complète.

Vous devez spécifier les en-têtes autorisés par votre serveur. dans votre cas Autorisation .

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization
54
Manuel Bitto

Bien que j’ai voté pour la réponse de @Manuel Bitto, 
Je voudrais poster une autre réponse contenant un filtre Cors complet qui fonctionne pour moi avec 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);
    }
}

Je suggérerais de faire particulièrement attention à l'ajout d'OPTIONS aux valeurs d'en-tête "Access-Control-Allow-Methods". 
La raison en est que, selon l’explication fournie ici par Mozilla, 
si votre demande (par exemple POST) contient un en-tête spécial ou un type de contenu (et c'est mon cas), l'objet XMLHttpRequest générera un appel OPTIONS supplémentaire, que vous devez adresser dans votre code. 
J'espère que ça aide.

2
Yair Zaslavsky

Le problème était que www.domain.com était considéré comme différent de domain.com . Domain.com fonctionnait, mais lorsque j'ai utilisé www.domain.com, il m'a détecté comme faisant des demandes provenant d'un domaine différent.

0
egidra

Je sais que cette question est plus ancienne.

Mais aujourd’hui, j’ai rencontré le même problème après avoir ajouté owin. Après nombre de recherche sur google et d'essayer diverses solutions. J'ai résolu le problème cors en ajoutant ci-dessous

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

Pour plus de détails, veuillez suivre les liens ci-dessous. Merci.

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

0
C For Code