2013-02-26 24 views
6

Fondamentalmente, ho un modulo di accesso che una volta autenticato avvia un processo Oauth2. Che funziona perfettamente fino a quando non deve eseguire il reindirizzamento finale che ottiene i token di accesso. Il flusso di accesso è il seguente POST a /user/login reindirizza a /user/oauth/auth quindi reindirizza a Oauth redirect_uri /user/oauth/redirect. Il redirect_uri non succede mai e la richiesta non colpisce mai il server.Safari Ajax cors richiesta non seguente reindirizzamento

Se eseguo il reindirizzamento utilizzando una richiesta Ajax, il cors funziona correttamente e ottengo la risposta prevista che sembra capitare solo se reindirizzamento due volte.

Il server mostra queste risposte

[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 

L'ultimo URL mai ottenere di colpo. In Chrome, IE, FF il flusso è lo stesso, tranne il server vede la richiesta

[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 

In Impostazioni Web vedo la richiesta, ma muore come un

enter image description here

Sto utilizzando jQuery 1.9 e qui è la richiesta AJAX (concesso ho ogni opzione sotto il sole qui per cercare di farlo funzionare.)

$.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 non è un'opzione come il p iniziale ost è inviato su https e deve essere una richiesta POST. Ancora una volta tutti gli altri browser, incluso IE, stanno funzionando bene, spara la risposta positiva.

Safari attiva lo Statuscode 0 e l'errore che è classico, ma che reindirizza uri funziona in una richiesta standard Ajax ignorando il login. Dubito che sia un problema di controllo degli accessi perché la chiamata funzionerebbe se Safari lo licenzierebbe.

Sono abbastanza sicuro che abbia qualcosa a che fare con le intestazioni delle richieste sul reindirizzamento e Safari sta interrompendo la richiesta. Al primo successo 302 assomigliano questo

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

Ma d'uri reindirizzamento appaiono come questo (che ha senso per spiegare perché è mancata la causa non ci sono intestazioni di controllo degli accessi di essere inviati, ma perché ??)

Origin: http://192.168.1.5:9090 
Accept-Encoding: gzip, deflate 
Accept-Language: en-us 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17 
Accept: */* 
Referer: http://192.168.1.5:9090/login 

risposta

5

Beh, sembra che questa sia una cosa di Safari, seguirà solo il primo reindirizzamento. Apple afferma che questo è il modo in cui è scritta la specifica HTML. Quindi .... dovuto rielaborare il mio flusso per non reindirizzare su /user/login e avviare subito il processo di oauth.

+1

"Apple afferma che questo è il modo in cui è scritta la specifica HTML" Potrebbe citare la fonte di ciò? – hrdwdmrbl

+0

Ci scusiamo per questa risposta molto tarda. Era un ingegnere con cui stavo parlando che funzionava sul webkit. Ma è veramente la specifica HTML5. Impostazione della richiesta Origin to null fa parte della specifica http://www.w3.org/TR/cors/ Vedere la fase 6 della sezione 7.1.7. –

+0

Capisco che JSONP non era un'opzione per te, ma per gli altri che si imbattono in questo ... Posso confermare che funziona su Safari con reindirizzamenti multipli su domini. – james

Problemi correlati