使用JSONP的Yelp API,OAuth和Angular只能运行一次

时间:2016-04-18 17:18:51

标签: javascript angularjs oauth jsonp yelp

所以this questionbeen asked几个times,但我相信我终于明白了这里出了什么问题。我正在使用带有Angular的Yelp API,这需要OAuth 1.0a才能访问。像大多数人一样,我使用following code



'angular.callbacks._0'




问题在于:

使用JSON_CALLBACK作为回调使它第一次工作,因为它强制它使用第一个回调,但是会中断后续请求。 You are actually supposed to use JSON_CALLBACK正确增加回调,但会破坏所有内容。 Yelp生成的错误是"无效的签名"。我相信这是由Angular在已经编码之后直到之后才取代if引起的,从而导致预期签名与实际签名不同。我正在使用this签名生成器。

我如何解决这个问题,确保Angular正确地增加回调,同时确保正确的签名生成?

1 个答案:

答案 0 :(得分:0)

我找到一种解决问题的丑陋方式。在下面的文章中,有一个描述如何创建自己的拦截器来增加jsonp回调参数(angular.callbacks._0,angular.callbacks._1等)

how to custom set angularjs jsonp callback name?

这个解决方案一对一在我的情况下不起作用。使用yelp和查询,你必须创建一个oauth签名,param回调应该分别包含在签名中,然后应该在执行jsonp请求之前增加。

所以,在我的服务中,在进行签名之前和执行jsonp请求之前,我只是调用计数器来生成新的增量。

在您的情况下,我会建议更改您的代码,如下所示:

var retrieveYelp = function (name, callback) {

// GENERATE increment and use it in the params
var callbackId = angular.callbacks.counter.toString(36);

      var method =  'GET';
      var url =     'http://api.yelp.com/v2/search';
      var params = {
        callback:                 'angular.callbacks._' + callbackId,
        ll:                       /* hidden */,
        radius_filter:            '3219',
        oauth_consumer_key:       /* hidden */, // consumer key
        oauth_token:              /* hidden */, //Token
        oauth_signature_method:   'HMAC-SHA1',
        oauth_timestamp:          new Date().getTime(),
        oauth_nonce:              randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'),
        term:                     name || 'food', 
        actionlinks:              true
      };

我发现解决方案不是超级决定,我同意,但那么至少它起作用并且似乎没有副作用。