在应用

时间:2017-10-19 22:47:57

标签: ios node.js swift oauth-2.0 uber-api

我有一个带有优步API集成的iOS应用程序,我使用SSO对用户进行身份验证,然后保存accessToken&我的设备本地刷新了。然后我打电话给我的服务器,他使用javascript后台函数调用node-uber(https://www.npmjs.com/package/node-uber)库向Uber发出请求。 到目前为止,我正在尝试使用SSO登录中的2个本地令牌设置超级客户端,如下所示:

var uber = new uberClient({
    client_id: '...',
    client_secret: '...',
    server_token: '...',
    name: 'My App',
    sandbox: true, //optional
    access_token: accessToken,
    refresh_token: refreshToken
  });

之后我想像这样调用uber.requests.getEstimatesAsync端点:

uber.requests.getEstimatesAsync({
      "start_latitude": pickupLocation["lat"],
      "start_longitude": pickupLocation["lng"],
      "end_latitude": dropoffLocation["lat"],
      "end_longitude": dropoffLocation["lng"]
      })
      .then(function(res) { 
        console.log(JSON.stringify(res)); 
      })
      .error(function(err) { 
        console.error(err); 
      });
})

虽然每次我在执行此操作时都会收到“invalid_grant”错误400。我是否在验证自己身份或设置优步客户端时出错?甚至可以使用我的SSO accessToken& refreshToken然后在超级客户端上进行OAuth2身份验证?我认为访问和刷新令牌应该与Uber发送回SSO& OAuth2用户。 我正在使用开发人员帐户执行此操作,因此我实际上应该拥有请求端点所需的所有权限,但我之前也在应用程序中正确获取了这些权限。

官方优步文件中的这个帖子解释了潜在的原因,但我猜他们并不真正适用于我的情况,是吗? https://developer.uber.com/docs/riders/guides/authentication/introduction#common-problems-and-solutions

这里的任何安全专家都可以提供帮助吗? 最好的祝福, 马特

P.S。:我也在我用来提出这些请求的优步图书馆上发布了这个问题,但到目前为止似乎没有人能够帮助我。 https://github.com/shernshiou/node-uber/issues/70

编辑:下图显示了到目前为止我的身份验证设置:

enter image description here

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我认为图书馆本身存在问题。因为一旦我使用"请求"库(https://github.com/request/request)它有效。包含在代码顶部的内容:

var request = require('request');

OAuth2和SSO accessToken都有效。你应该为方法提供一个纬度和经度的pickupLocation以及你从Uber获得的accessToken,如下所示:

function getAllAvailableUberProducts(pickupLocation, accessToken){
    var lat = pickupLocation["lat"].toString();
    var lng = pickupLocation["lng"].toString();

    var options = {
        uri: "https://api.uber.com/v1.2/products?latitude="+lat+"&longitude="+lng,
        method: 'GET',
        headers: {
            "Authorization": "Bearer " + accessToken,
            "Accept-Language": "en_US",
            "Content-Type": "application/json"
        }
    };

    request(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(JSON.parse(body).products);
        } else {
            console.log(error);
        }
    });
}

我希望这有助于某人。