2013-02-26 6 views
6

Grundsätzlich habe ich ein Login-Formular, das einmal authentifiziert es startet einen Oauth2-Prozess. Was einwandfrei funktioniert, bis es die letzte Umleitung durchführt, die die Zugriffsmarken erhält. Der Login-Ablauf ist wie folgt: POST zu /user/login leitet zu /user/oauth/auth um und leitet dann zum Oauth redirect_uri /user/oauth/redirect um. Die redirect_uri passiert nie und die Anfrage trifft nie den Server.Safari Ajax Cors Anfrage nicht folgende Umleitung

Wenn ich diese Umleitung mit einer Ajax-Anfrage treffe, funktioniert die Cors gut und ich bekomme die erwartete Antwort, die nur dann zu passieren scheint, wenn ich zweimal umleitung.

Der Server zeigt diese Antworten

[I 130226 10:16:38 web:1462] 302 POST /user/login (192.168.1.5) 156.01ms (Session cookies set fine) 
[I 130226 10:16:38 web:1462] 200 OPTIONS /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 1.86ms 
302 GET /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 8.58ms 

Die letzte URL nie getroffen zu werden. In Chrome, IE, FF der Strömung ist die gleiche, außer der Server die Anforderung Inspector

[I 130226 10:16:38 web:1462] 302 POST /user/login (192.168.1.5) 156.01ms 
[I 130226 10:16:38 web:1462] 200 OPTIONS /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 1.86ms 
302 GET /user/oauth/auth?scope=&client_id=DemoApp&response_type=code&redirect_uri=http://192.168.1.5:8443/user/oauth/redirect/code (192.168.1.5) 8.58ms 
[I 130226 10:27:12 web:1462] 200 GET /user/oauth/redirect/code?code=57497058fbbf6003310ea22d3902ac67 (192.168.1.5) 0.54ms 

Im Web sehe ich die Anfrage sehen, aber stirbt wie ein

enter image description here

Ich bin mit JQuery 1.9 und hier ist der ajax-Request (erteilen ich hier jede Option unter der Sonne habe, es zu versuchen und arbeiten.)

$.ajax({ 
    type: "POST", 
    url: reqUrl, 
    data: data, 
    dataType: "json", 
    success: function(data, textStatus) { 
      console.log(data); 
      alert('logged in'); 

    }, 
    error: function(e){ 
     console.log(e); 
    }, 
    complete: function(request, status) { 
     console.log("headers=" + request.getAllResponseHeaders()); 
    }, 
    statusCode: { 
    200: function(data) { 
     console.log('yup we got it.') 
    } 
    }, 
    xhrFields: { 
    withCredentials: true 
    }, 
    crossDomain: true, 
    async:true 
}); 

JSONP keine Option, da die anfänglichen p Ost wird über https gesendet und muss eine POST-Anfrage sein. Wieder funktionieren alle anderen Browser einschließlich IE einwandfrei, es löst die Erfolgsreaktion aus.

Safari feuert den Statuscode 0 und den Fehler, der eine klassische Ursprungsrichtlinienfehler ist, aber das Umleitungs-URI funktioniert in einer Standard-Ajax-Anforderung, die die Anmeldung umgeht. Ich bezweifle, dass es sich um ein Problem bei der Zugriffssteuerung handelt, weil der Anruf funktionieren würde, wenn Safari ihn nur auslösen würde.

Ich bin mir ziemlich sicher, es hat etwas mit den Anfrage-Header auf der Weiterleitung zu tun und Safari stoppt die Anfrage. Auf den ersten erfolgreichen 302 sehen sie aus wie diese

Access-Control-Request-Method: GET 
Origin: http://192.168.1.5:9090 
Access-Control-Request-Headers: origin, accept-encoding, accept-language 

Aber auf der Umleitung uri sehen sie aus wie diese (was Sinn, warum macht es andernfalls Ursache gibt es keinen Zugriffs-Control-Header gesendet werden, aber warum ??)

Antwort

5

Nun, es sieht so aus, als wäre dies eine Safari-Sache, es wird nur der ersten Weiterleitung folgen. Apple behauptet, dass auf diese Weise die HTML-Spezifikation geschrieben wird. Also .... musste meinen Flow überarbeiten, um nicht auf /user/login umleiten und den oauth-Prozess sofort starten.

+1

„Apple behauptet, dass dies der richtige Weg ist die HTML-Spezifikation geschrieben“ Könnten Sie bitte Ihre Quelle, dass zitieren? – hrdwdmrbl

+0

Entschuldigung für diese wirklich späte Antwort. Es war ein Ingenieur, mit dem ich im Webkit gearbeitet habe. Aber es ist wirklich die HTML5-Spezifikation. Das Festlegen der Anforderung Origin auf null ist Teil der Spezifikation. Http://www.w3.org/TR/cors/ Siehe Schritt 6 in Abschnitt 7.1.7. –

+0

Ich verstehe, dass JSONP für Sie keine Option war, aber für andere, die auf dieses Problem stoßen, kann ich bestätigen, dass es in Safari mit mehreren Weiterleitungen über Domains funktioniert. – james