2012-01-16 9 views
2

私は基本認証を必要とするモバイルWebアプリケーションを持っています。私は別のドメインのサーバー上でAjaxを使って基本認証を呼び出すことができました。しかし、私は応答に問題があります。リクエストされたAjaxが別のドメインから返されたときにCookieを設定する

通常、セッションIDは、設定されたCookieヘッダーを通じてAjaxレスポンスによってブラウザに設定されます。私は、これが成功した認証で起こらなかったことに気づいた。

私がしたのは、応答が返されたときにヘッダーを読み取ってクッキーを手動で設定しようとしたことでした。私はこれをjQuerysのjqxhrオブジェクトで実現しました。私の驚いたことに、たとえサーバーがsessionIDが返されたと表示したとしても、jqxhrを介して応答にクッキーヘッダーが設定されていないことがわかりました。

これは相互ドメイン要求の予想される動作ですか?いくつかの応答ヘッダーがドロップされるでしょうか?これはブラウザのセキュリティ機能ですか?もしそうなら、あなたはこれを回避するために何を提案しますか?(例えば、身体のセッションIDを返します。これは私がShiroセキュリティフィルターを使っているためにしたくありません。それをハックする必要がありますか?)

助けてください

答えて

0

ajaxを使用してドメイン間URIを要求することはできません。遠隔の認証サーバーで要求/応答を処理する独自のサーバー側プロキシを実装する必要があります。それは単にレスポンスをコピー/ペーストすることができますが、クライアントと同じドメインになければなりません。

クッキーと同じことですが、それらには読み書きができるドメインがあります。

あなたはこのプロキシのリクエストのみを許可されます。また、クッキーの作成プロセスを処理してから、クッキーIDをクライアントに返すこともできます。 (非常に単純な)例えば

は、www.auth.comに、あなたは、このWebサービスを持っている:

url : www.auth.com/auth 
@params : string uuid, string password 
@returns : int shiroSessionId // yes it's more complicated, but KISS for the example 

あなたは、WWWをwgetのwww.mydomain.com/myAuthクラスで、作成する必要があります。同じパラメータでauth.com/authサービスと作成ローカルセッションクッキー

url : /myAuth 
@params : string uuid, string password 
@returns : int cookieId, -1 if login failed 

そして最後にwww.mydomain.com/login.htmlでは、あなたは(ここではjqueryの中)JS次の呼び出しを持つことになります。

$.ajax(function() { 
    url : '/myAuth', 
    date : {uuid: inputUuid, password: inputPassword}, // provided by a form 
    success(cookieId) { 
    if(cookieId > 0) { 
     alert('logged with cookie '+getCookie(cookieId)); 
    } else { 
     alert('login failed'); 
    } 
    } 
}); 

希望します。

ありがとうございます。

+0

彼はおそらくjsonpを使用しています。 – ThatGuy

+0

私はアプリケーションからのクロスドメインajax要求を許可するために、サーバー側でAllow-Originヘッダーを使用しています。アプリケーションは、電話のギャップがパッケージ化され、モバイルに展開されます。したがって、アプリケーションを提供するサーバーは存在しません。モバイル上で実行されるだけです。 PhoneGapはブラウザのラッパーで動作するようパッケージするので、クロスドメインはおそらく適用されます。 – rycfung

+0

ヘッダーのAccess-Control-Allow-Originが「*」でない限り、これも機能します。 – vaugham

関連する問題