在 AngularJS 中访问 JSONP 请求的真实 URL

Posted

技术标签:

【中文标题】在 AngularJS 中访问 JSONP 请求的真实 URL【英文标题】:Access the Real URL for JSONP request in AngularJS 【发布时间】:2013-11-09 02:56:06 【问题描述】:

这是使用$http 的 JSONP 函数进行 JSONP 调用的基本设置

var authenticatedUrl = authenticateUrl("http://example.com/getStuff&callback=JSON_CALLBACK");
return $http.jsonp(authenticatedUrl).then(function (response) 
  ...

问题是,我的 HMAC 身份验证器正在使用 callback=JSON_CALLBACK 创建基于 URL 的哈希,然后当 Angular 发出实际请求时,URL 更改为将 angular.callbacks._0 作为回调参数,这使我的身份验证哈希无效。

如何访问将用于此 JSONP 请求的真实网址?

根据我的研究,拦截器似乎是解决这个问题的方法,但我似乎无法找到具有angular.callbacks._0 回调的 URL 的对象。

【问题讨论】:

愚蠢的问题,authenticate the url 是什么意思? @charlietfl - HMAC 身份验证。它根据 URL 和密钥生成哈希字符串。 @charlietfl - 我编辑了问题以澄清我真正想要的(真正的请求 URL)。 【参考方案1】:

如果我理解正确,您使用的是 Hawk - Single URI Authentication 之类的东西;这是您获得一个必须附加到 url 的令牌,并且该令牌对该确切的 url 有效。

您遇到的问题不是角度本身,而是每个 jsonp 框架应该工作的方式。

我会建议分叉 JSONP 以添加此行为或手动执行 JSONP。

var i = 0;
function call_endpoint(callback) 
    i++;
    var url = "http://example.com/getStuff&callback=callback_" + i;

    //append the token here, or call your endpoints to fetch the endpoint.

    window["callback_" + i] = function (data) 
      delete window["callback_" + i]; 
      callback(data);
    ;

    script = document.createElement('script');
    script.src = url;

    var target = document.getElementsByTagName('script')[0] || document.head;
    target.parentNode.insertBefore(script, target);

【讨论】:

我觉得应该有一些东西可以公开“转换后的”url(带有angular.callbacks._0的那个)。我在想类似于 jquery 的 ajax 的东西,有一个“beforeSend”选项,我可以在其中访问 url。因为转换后的 url 没有公开(我可以找到),所以无法创建正确的身份验证令牌。

以上是关于在 AngularJS 中访问 JSONP 请求的真实 URL的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 中的 JSONP 请求不像 jQuery 那样工作

angularjs jsonp跨域请求网络看到了请求值,但是一直走error

如何在 AngularJS 中插入命令或阻止 $http 的 JSONP 自动解析?

在 AngularJS 中设置 JSONP 回调函数

Angularjs JSONP不起作用

AngularJs $http 请求服务