4

解决了 - 是 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 不执行跨域调用?

4

0 回答 0