解决了 - 是 Adblock Plus
我有一个跨域 OAuth 场景,我直接从 JavaScript 在第 3 方 api 上调用 OAuth 保护的 jsonp 资源。
客户端依赖我的服务器(原始站点)为提供程序上的 OAuth 资源生成签名请求 URL。客户端直接获取这些 OAuth 资源,试图将我的服务器的 OAuth 代理职责限制为简单地生成签名资源 url 并让 JS 完成其余的工作。这是JS:
myNamespace = {
callApi: function(signedRequest, callback) {
$.ajax({
url: signedRequest,
dataType: "jsonp",
type: "GET",
crossDomain: true,
jsonp: false,
jsonpCallback: callback,
cache: true,
async: true
});
},
usersCallback: function(jsonp) {
alert(jsonp);
},
getOAuthResource: function(resource, callback) {
$.ajax({
url: "/GetSignedRequest?resource=" + encodeURIComponent(resource + "&callback=" + callback),
success: function (signedRequest) {
myNamespace.callApi(signedRequest, callback);
}
});
}
}
因为在签署请求时参数顺序很重要,所以我手动包含回调,以便它被排序并包含在服务器生成的签名请求中。
因此,示例用法很简单,
myNamespace.getOAuthResource("/users?id=1", "myNamespace.usersCallback");
这适用于 FireFox 20 和 IE 10 - 我从提供者那里得到警报消息和预期的 json。
Chrome 26 拒绝对提供者执行跨域调用。在开发工具中,跨域资源的 GET 立即显示“(失败)”状态,并且 GET 在控制台中显示为错误。
如果我随后要求 Chrome 在新窗口中打开这个所谓的“失败”的 URL,它会直接在提供程序上重新请求 URL,我会得到预期的 jsonp 响应:
myNamespace.usersCallback({...})
为什么 Chrome 不执行跨域调用?