我有一个跨域OAuth场景,我直接从JavaScript调用第三方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在新窗口中打开这个假设的“失败”网址,它会直接在提供商处重新请求网址,并获得预期的jsonp响应:
myNamespace.usersCallback({...})
为什么Chrome不会执行跨域调用?