web-dev-qa-db-ja.com

ChromeまたはFirefoxの場合、jquery $ .ajax呼び出しは401不正な応答になりますが、IEで動作します

別のドメインのサービスエンドポイントにいくつかのGETリクエストを送信するためにJQuery $ .ajaxメソッド(現在jquery 1.7.2を使用)を使用する必要があるスクリプトをWebページで実行しています。 IE(9、10、11)でajax呼び出しが機能していますが、FirefoxとChromeで401 Unauthorized応答で失敗します。Chromeは「このリソースにアクセスするには完全な認証が必要です」です。

私のajax呼び出しは次のように設定されています(これらの要求が失敗した場合、dataTypeは「json」で、asyncはtrueです)。

    $.ajax({
      url: url,
      type: "GET",
      async: isAsync,
      dataType: dataType,
      username: user,
      password: pswd,
      success: function (response, status) {
         // success code here
      },
      failure: function (response, status) {
         // failure code here
      },
      complete: function (xhr, status) {
         // on complete code here
      }
   });

サービスへのアクセスに必要なユーザー名とパスワードを渡していますが、これはIEで機能します。 JQuery ajax関数が認証を正しく処理することを理解していたため、承認が必要であることを示す応答が返された場合、提供された資格情報を使用して、その要求を正しく行います。ここで何か不足していますか?これを機能させるには、Authorizationヘッダーを手動で追加する必要がありますか?

更新:F = 12デバッグツールを介してChromeおよびIEによって報告された要求、応答、およびcookie情報です(一部の情報は[... removed ...])

クローム(42.0.2311.90 m)

応答ヘッダー

access-control-allow-credentials:true access-control-allow-Origin:[... removed ...] access-control-expose-headers:cache-control:private、max-age = 0、must-revalidate connection :keep-alive content-encoding:gzip content-length:296 content-type:text/html; charset = ISO-8859-1 date:Tue、21 Apr 2015 20:55:12 GMT expires:Tue、21 Apr 2015 20 :55:12 GMT p3p:CP = "NON DSP COR CURa PSAa PSDa OUR NOR BUS PUR COM NAV STA" set-cookie:JSESSIONID = qd-app-1348vf1vrksvc76oshcwirvjp.qd-app-13 ; Path = /; Secure; HttpOnly set-cookie:NSC_vt1.sbmmzefw.dpn!-!IUUQT = ffffffff09091c3945525d5f4f58455e445a4a42378b; path = /; secure; httponly status:401 Unauthorized vary:Accept-Encoding version:HTTP/1.1 www-authenticate realm = "ラリーALM"

リクエストヘッダー

:Host:rally1.rallydev.com:method:GET:path:[...削除...]:scheme:https:version:HTTP/1.1 accept:application/json、text/javascript、/; q = 0.01 accept-encoding:gzip、deflate、sdch accept-language:en-US、en; q = 0.8 Origin:[... removed ...] referer:[... removed ...] user-agent :Mozilla/5.0(Windows NT 6.1; WOW64)AppleWebKit/537.36(KHTML、like Gecko)Chrome/42.0.2311.90 Safari/537.36

応答Cookie

JSESSIONID qd-app-1348vf1vrksvc76oshcwirvjp.qd-app-13 NSC_vt1.sbmmzefw.dpn!-!IUUQT ffffffff09091c3945525d5f4f58455e445a4a42378b

IE 11

リクエストヘッダー

GETリクエスト[...削除...]リファラー[...削除...]承認
application/json、text/javascript、/; q = 0.01 Accept-Language en-US Accept-Encoding gzip、deflate User-Agent Mozilla/5.0(Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)like Gecko Host [... removed ...] Connection Keep -Alive Cache-Control no-cache Cookie
JSESSIONID = qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-08; NSC_vt1.sbmmzefw.dpn!-!IUUQT = ffffffff09091c3145525d5f4f58455e445a4a42378b; RALLY-Detail-treeCollapsed = false; ZSESSIONID = RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU; SUBBUCKETID = 713

応答ヘッダー

レスポンスHTTP/1.1 200 OK RallyRequestID qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-0810353108 Expires Thu、01 Jan 1970 00:00:00 GMT Content-Type text/javascript; charset = utf-8 ETag "0101c2c8d3463ee3c1a4f950d4142b7d3" P3P CP = "NON DSP COR CURa PSAa PSDa OUR NOR BUS PUR COM NAV STA" Cache-Control private、max-age = 0、must-revalidate日付火、2015年4月21日20:58:17 GMT接続キープアライブSet-Cookie ZSESSIONID = RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU; Path = /; Domain = [... removed ...]; Secure; HttpOnly Set-Cookie SUBBUCKETID = 713; Path = /;ドメイン= [...削除...]; Secure; HttpOnly Content-Length 319

クッキー

JSESSIONID qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-08を送信しました
送信NSC_vt1.sbmmzefw.dpn! - セッションのIUUQTのffffffff09091c3145525d5f4f58455e445a4a42378b送信RALLY-詳細-treeCollapsed誤送信されZSESSIONID RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhUのSENTのSUBBUCKETID 713受信ZSESSIONID RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhUで端[...削除...] /はいはい受信SUBBUCKETID 713セッションの終了時[...削除...] /はいはい

8
AK3800

私は jqueryフォーラムの投稿 に出くわしましたが、この問題に関する追加情報がありました。そこで見つけたものに基づいて、これを$ .ajax呼び出しに追加しました。

  beforeSend: function (xhr) {
     xhr.setRequestHeader('Authorization', makeBaseAuth(user, pswd));
  }

makeBaseAuth()は次のようにbtoa()関数を使用します。

   makeBaseAuth: function(user, pswd){ 
      var token = user + ':' + pswd;
      var hash = "";
      if (btoa) {
         hash = btoa(token);
      }
      return "Basic " + hash;
   }

Chrome=で動作しているようですが、ログインプロンプトまたは401応答が返されません。リクエストは処理中で、期待される応答が返されます。オプションxhrFields: { withCredentials: true }も削除しました。何らかの理由で、これはまだFirefoxでは機能していません。Firefoxデバッガでは、JavaScriptを使用して適切なデバッグを行って問題を確認することはできません。スクリプトが機能するのは、そのスクリプトが匿名スクリプトとしてWebページに読み込まれることであり、それを制御することはできません。IEとChromeでスクリプトを取得する方法はありますが、Firefoxではできません何らかの理由で、私はこれをChromeで機能させるだけの勝利だと思っています。

7
AK3800