2013-01-24 17 views
13

Ich versuche, einfache CORS-Anfrage an externe Anwendungsserver, die Sitzungsschlüssel für die Autorisierung verwendet senden.CORS-Anfrage schlägt in Chrome nur fehl, wenn Header

$.ajax({ 
    type: "GET", 
    url: "https://192.168.1.72:8442/api/file/", 
    headers: {"Authorization": "3238562439e44fcab4036a24a1e6b0fb"} 
}); 

Es funktioniert gut in Firefox 18, Opera 12.12 und Rekonq 2.0 (verwendet auch WebKit), aber in Google Chrome funktioniert nicht (versucht Versionen 21 und 24). In Google Chrome wird die Option OPTIONS angezeigt. Die Ressource konnte im Netzwerkinspektor nicht geladen werden, und der Anwendungsserver erhält keine Anforderung. Ich habe jQuery 1.8.3 und 1.9.0 versucht.

Request URL:https://192.168.1.72:8442/api/file/ 
Request Headers 
Access-Control-Request-Headers:accept, authorization, origin 
Access-Control-Request-Method:GET 
Cache-Control:no-cache 
Origin:https://192.168.1.72:8480 
Pragma:no-cache 

Wenn ich entfernen Header aus der Anforderung dann erhalte ich 401 auch in Google Chrome und es ist in der Lage, die Ressource im Fall der Genehmigung für den Zugriff auf Anwendungsserver deaktiviert. Es spielt keine Rolle, welche Header gesendet werden. Nur Header, den ich senden kann, ist {"Content-Type": "plain/text"}. Alle anderen Header-Namen/Werte geben einen Fehler in Google Chrome, funktionieren aber in allen oben genannten Browsern.

Warum Google Chrome behandelt Header in CORS-Anfrage nicht?

+1

Versuchen 'GENEHMIGUNGS mit einem gemeinsamen' a' – Musa

+0

@Musa: Noch gleich. –

+0

Können Sie die Anforderungs- und Antwortheader für die OPTIONS-Anfrage auflisten?Der Server sollte mit folgenden Antworten antworten: 'Access-Control-Allow-Origin: *' 'Zugriffssteuerungs-Erlauben-Methoden: GET, PUT, POST, DELETE' ' Zugriffskontrolle-Zulassen-Header: accept , Autorisierung, Herkunft – monsur

Antwort

1

Server-Seite: Der Server sollte den Header "Access-Control-Allow-Credentials" gesetzt und auch die erlaubten Header in "Access-Control-Allow-Header" gesetzt.

Clientseite: Sie können xhrFields in $ .ajax() setzen, anstatt den Auth-Header explizit zu übergeben.

xhrFields: { 
    withCredentials: true 
} 

Mehr Details here.

+0

withCredentials scheint für Cookies oder grundlegende Auth. Ich möchte nur Anforderungsheader in Chrome verwenden. –

2

Ich benutze selbstsigniertes Zertifikat auf meinem API-Server und das scheint das Problem zu sein. Ich habe festgestellt, dass, wenn ich Google Chrome mit der Option --disable-web-security starte, CORS mit Anforderungsheadern funktioniert. Ohne --disable-web-security kann ich CORS-Anfragen an selbstsignierte API-Server senden, aber keine Header hinzufügen (außer Content-Type).

+0

Dasselbe Problem tritt auf, wenn eine Domäne mit einer anderen Domäne verbunden ist (beide verwenden http). Ihre Option --disable-web-security behebt diesen Fall ebenfalls. Ich glaube, * dieser * Bug ist spezifisch für EventSource und könnte in Chrome 26 behoben sein. Allerdings hat '--disable-web-security' das selbstsignierte HTTPS-Problem (ob EventSource oder XMLHttpResponse) nicht behoben, zumindest nicht in Chrome 25. –

2

Ich fand, dass Access-Control-Erlaube-Header: * sollte nur für "OPTIONS" Anfrage eingestellt werden. Wenn Sie es für POST-Anfrage dann zurück Browser für mich

// Allow CORS 
header("Access-Control-Allow-Origin: *"); 
header('Access-Control-Allow-Credentials: true');  
header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 

// Access-Control headers are received during OPTIONS requests 
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
    header("Access-Control-Allow-Headers: *"); 
} 

ich ähnliche Fragen mit etwas irreführende Antwort die Anfrage (zumindest für Chrom)

Die folgenden PHP-Code funktioniert Abbrechen gefunden: - Server-Thread sagt, das ist 2 Jahre Bug von Chrome: Access-Control-Allow-Headers stimmt nicht mit localhost überein. Es ist falsch: Ich kann CORS zu meinem lokalen Server mit Post normalerweise verwenden - Access-Control-Allow-Header akzeptiert Platzhalter. Es ist auch falsch, Wildcard funktioniert für mich (ich testete nur mit Chrome)

Das dauert mich einen halben Tag, um das Problem herauszufinden.

Glücklich Codierung

+0

Der erste Satz dieses Beitrags hat mich gerettet. Vielen Dank! – Jonah