web-dev-qa-db-de.com

Fehler 'Feld für Anforderungsheader zulassen' Fehler - Tastypie

Bei der Verwendung von ApiKeyAuthentication für meine Tastypie-Ressourcen wird beim Versuch, eine HTTP-Anforderung mit AJAX und Tastypie auszuführen, folgende Fehlermeldung angezeigt:

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.

Irgendwelche Ideen, wie man das lösen kann?

Hier sind die Anforderungsheader von 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

Hier sind die Antwortheader von 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

Wie Sie sehen, haben beide Header für die Autorisierung, die Autorisierung funktioniert jedoch nicht.

Hier ist die Django-Middleware, die ich zum Bearbeiten der Antwortheader verwende: https://Gist.github.com/1164697

Edit: Ich habe das Problem herausgefunden. Ich habe versucht, eine Verbindung zu www.domain.com herzustellen, und es wird nur domain.com akzeptiert

24
egidra

Dies geschieht aufgrund der Same Origin-Richtlinie .

Sie müssen AJAX von derselben Domäne aus aufrufen, in der die Anforderung ausgeführt wird. Oder nehmen Sie serverseitige Änderungen vor, um Anforderungen von externen Domänen zuzulassen.

Um dies zu beheben, müssen Sie Änderungen an den Kopfzeilen von http://domain.com vornehmen, indem Sie Ihre externe Domäne in Kopfzeilen zulassen:

Access-Control-Allow-Origin: *

Lese mehr

5
antyrat

Antyrats Antwort ist nicht vollständig.

Sie müssen angeben, welche Header Ihr Server zulässt. in Ihrem Fall Autorisierung .

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

Obwohl ich die Antwort von @Manuel Bitto bestätigt habe, 
Ich möchte eine weitere Antwort posten, die einen vollständigen Cors-Filter enthält, der für mich mit Apache Tomcat 5.x funktioniert:

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);
    }
}

Ich würde vorschlagen, speziell auf die Hinzufügung von OPTIONS zu den Header-Werten "Access-Control-Allow-Methods" zu achten. 
Der Grund dafür ist, dass gemäß der gegebenen Erklärung hier von Mozilla, 
Wenn Ihre Anforderung (beispielsweise POST) einen speziellen Header oder einen bestimmten Inhaltstyp enthält (und dies ist in meinem Fall der Fall), generiert das XMLHttpRequest-Objekt einen zusätzlichen Aufruf von OPTIONS, den Sie in Ihrem Code ansprechen müssen. 
Ich hoffe das hilft.

2
Yair Zaslavsky

Das Problem war, dass www.domain.com als anders angesehen wurde als domain.com Domain.com funktionierte, aber als ich www.domain.com verwendete, erkannte ich, dass ich Anfragen von einer anderen Domain erledigte

0
egidra

Ich weiß, dass diese Frage älter ist.

Aber heute bin ich nach dem Hinzufügen von owin auf die gleiche Frage gestoßen. Nach Anzahl der Suche bei Google und Ausprobieren verschiedener Lösungen. Ich löste das Problem der Korsik, indem ich unten hinzufügte

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

Für weitere Details folgen Sie bitte den untenstehenden Links. Vielen Dank.

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

0
C For Code