-1

だから...私はクロスドメイン(CORS)呼び出しを行っています。最初にページで作成したときは問題なく動作しますが(クロスドメインの問題は実際には問題ではないことに注意してください)、後で同じサーバーに別のリクエストを作成してヘッダーにベアラー認証トークンを追加すると、 401 Unauthorized で失敗します。

また、同じドメインからこのコードを実行すると、両方の呼び出しが正常に実行されます (トークンが正常であることを識別します...)

考え?

$.ajax({
  url: apiPath.userMetaUrl(),
  xhrFields: { 
    withCredentials: true 
  },
  cache: false,
  error: function (xhr, ajaxOptions, thrownError) {
    console.log("url: " + apiPath.userMetaUrl());
    console.log("fn loadUserMetaData xhr.status: " + xhr.status);
    console.log("fn loadUserMetaData xhr.responseText: " + xhr.responseText);
    console.log("fn loadUserMetaData thrownError: " + thrownError);
  },
  dataType: "json",
  jsonpCallback: "callback",
  beforeSend : setHeader,
  success: function (data) {
    //woohoo!
  }
}

function setHeader(xhr) {
  xhr.setRequestHeader('Authorization', 'Bearer ' + authenticatedInfo.access_token);
}

繰り返しますが、このコードを apiPath.userMetaURL() と同じドメインから実行すると問題なく動作します。別のドメインでは、リクエスト ヘッダーを追加しない最初の呼び出しは正常に機能します。Access-Control-Allow-Oign にはクロスドメイン URL が追加されています。Access-Control-Allow-Headers には Authorization が追加されています。xhr.status は 0 を返し、responseText/thrownError は空白です。

4

1 に答える 1

1

JSONP != ajax

<script>これらのリクエストは、DOM にタグを追加するだけです。使いやすいように ajax 構文でラップされているだけです。この方法でリクエスト ヘッダーを変更することはできません。CORS ajax リクエストを作成し、それらを処理するようにサーバーを構成する必要があります。

ただし、同じドメインでjsonpリクエストを実行しています... jQueryは単に使用していると思いxmlHttpRequestます。クロスドメインの場合、<script>タグを使用します。これにより、表示されている動作が説明されます。

以下を検討してください。

$.ajax({
    url: 'http://google.com', 
    dataType: 'jsonp', 
    beforeSend: function(xhr) { xhr.setRequestHeader('foo', 'bar'); }
});

ネットワーク トラフィックを確認します。fooリクエストは作成されますが、ヘッダーは表示されません。

于 2013-09-16T19:51:02.647 に答える