2013-02-26 5 views
6

基本的には、一度認証されると、Oauth2プロセスを開始するログインフォームがあります。アクセストークンを取得する最後のリダイレクトを実行するまで、完璧に動作します。ログインフローは次のようになります。/user/loginへのPOSTは/user/oauth/authにリダイレクトされ、Oauth redirect_uri /user/oauth/redirectにリダイレクトされます。 redirect_uriは決して起こらず、要求は決してサーバーにヒットしません。Safari Ajaxのリクエストはリダイレクトに従わない

私がAjaxリクエストを使ってそのリダイレクトをヒットした場合、corsはうまく動作し、期待される応答を得ることができます。

サーバーは、これらの応答

[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 

最後のURLがのヒット取得することはありません示しています。クローム、IEでは、フローは、サーバを除いて同じであるFF私は要求を参照してくださいが、私はjQueryのを使用してい

enter image description here

のように死ぬのWebインスペクタで

[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 

リクエストを見て1.9、ここでは、Ajaxのリクエストである(私は試してみて、それを動作させるために、ここでは太陽の下ですべてのオプションを持って許可された。)

$.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は初期Pとしてオプションではありませんostはhttpsで送信され、POST要求でなければなりません。 IEを含む他のすべてのブラウザも正常に動作しています。成功応答が発生します。

SafariがStatuscode 0を発生させ、古典的なOriginポリシーエラーですが、リダイレクトuriはログインをバイパスして標準のajaxリクエストで動作します。私はそれがアクセス制御の問題だと思っています。なぜなら、Safariが起動するだけであればその呼び出しが機能するからです。

リダイレクトのリクエストヘッダーと何か関係があり、Safariがリクエストを停止していることは間違いありません。最初に成功した302彼らはこの

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

のように見える。しかし、リダイレクトURIに、彼らは(それが原因の失敗だ理由として理にかなっているが送信されてはアクセス制御ヘッダーがありませんが、なぜ??)このようになり

答えて

5

これはSafariのようですが、最初のリダイレクトのみに従います。 Appleは、これがHTML仕様が書かれている方法だと主張する。だから... /user/loginにリダイレクトしないように私の流れを書き直し、すぐにoauthプロセスを開始しなければならなかった。

+1

「Appleが、これがHTML仕様の書き方であると主張している」 あなたのソースを挙げてください。 – hrdwdmrbl

+0

申し訳ありませんが、この本当に遅く返信します。それは私がWebkitに取り組んで話していたエンジニアでした。しかし、それは本当にHTML5の仕様です。 要求元をnullに設定することは、http://www.w3.org/TR/cors/の一部です。 セクション7.1.7の手順6を参照してください。 –

+0

私はJSONPはあなたのためのオプションではないが、これに遭遇する他のユーザーのために...私はそれがSafariでドメイン間で複数のリダイレクトを使用できることを確認できます。 – james

関連する問題