2016-10-24 19 views
2

ログアウトが必要なクロスオリジン要求を送信するために、自分のサーバーから別のサーバーにログインしようとしています。出来ますか?Ajaxでクロス・オリジン・ログインを行うことはできますか?

私は2つのWebサーバーAとBを持っています.www.a.comとwww.b.comを言います。 Bには、クライアントがログインしている場合にのみ使用できるAPIがあります。クライアントからそのAPIを使用する必要があります。

したがって、Aクライアント(ajax(post))のログイン要求をB. BレスポンスにCORSヘッダー、セッションクッキー、Bのホーム/インデックスへのリダイレクトに送信します。

しかし、クライアントからBサーバーに2番目のajaxリクエスト(jsonpリクエスト)を送信すると、このリクエストは以前のセッションCookieを送信しないため、ログインリクエストは失敗しました。

私は(2番目のブラウザタブで)手動www.b.comにログインしている場合、AからBへのすべての要求は、ログオンしているユーザーとして検出に成功しているので、BのAPIはA.

Iから作品私のログインリクエストから受け取ったセッションクッキーがブラウザに保存されていないと思う。使用

$.post("www.b.com/login", { 'j_username': 'username', 'j_password': 'password' }); 

jqXHR.withCredentials = true; 
settings.crossDomain = true; 

レスポンスヘッダ:

は、これは私のログイン要求である

Access-Control-Allow-Headers:x-requested-with 
Access-Control-Allow-Methods:POST, GET, OPTIONS 
Access-Control-Allow-Origin:* 
... 
Location:http://www.b.com/home 
... 
Set-Cookie:JSESSIONID=tY++VWlMSxTTUkjvyaRelZ0o; Path=/ 

www.a.comかへと保存されている受信クッキーwww.b.com?クライアントのajaxリクエストからこのクッキーをwww.b.comに設定するにはどうすればよいですか?私はそれが問題だと思う。

+0

'b.com'が' Set-Cookie'ヘッダで応答すると、 'b.com'のクッキーが設定されます。これはあなたが望むものです。しかし、サーバーがワイルドカード 'Access-Control(アクセス制御)を与えた場合、認証されたCORS要求が失敗するため、ワイルドカードではない原点(' * 'ではなく 'http:// www.a.com')を指定する必要があると思います-Allow-Origin:* 'response](http://stackoverflow.com/q/19743396/710446)。 – apsillers

答えて

3

apsillerによると、ワイルドカードAccess-Control-Allow-Origin:*は使用できません。 しかし、これは問題を解決しません。

jqXHR.withCredentials = trueを設定していました。 beforeSendハンドラ関数の内部

$.post({ 
     ... 
     beforeSend: function(xhr) { 
      xhr.withCredentials = true; 
     }, 
     ... 
}); 

そして、何らかの理由でこれが機能しません。資格情報の使用を直接設定する必要がありました。

$.post({ 
     ... 
     xhrFields: { 
      withCredentials: true 
     }, 
     ... 
}); 

このコードは完全に機能します。

ありがとう。

+0

ExtJSを使うと、 'Ext.Ajax.request({withCredentials:true、...})'のようになりましたが、あなたのヒントは問題を解決する鍵でした! –

関連する問題