-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-Orign 添加了跨域 URL。Access-Control-Allow-Headers 添加了授权。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 回答