从App中的SSO获取access_token时对OAuth2请求的invalid_grant

我有一个与Uber API集成的iOS应用程序,我使用SSO来validation用户,然后在我的设备上本地保存accessToken&refreshToken。 然后,我打电话给我的服务器,使用javascript后台函数调用节点 – 超级( https://www.npmjs.com/package/node-uber )库来向Uber请求。 到目前为止,我试图用SSOlogin中的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,而这样做。 我是否犯了一个错误的身份validation错误或设立Uber客户端错误? 是否有可能使用我的SSO accessToken&refreshToken然后在uber客户端,进行OAuth2authentication? 我认为访问和刷新令牌应该和Uber发回给SSO和OAuth2的一样。 我正在使用开发者帐户来完成此操作,因此我实际上应具有请求端点所需的所有权限,但我之前在应用程序中也正确获得了它们。

这个官方的超级文档的线索解释了潜在的原因,但我想他们并不适用于我的情况,是吗? https://developer.uber.com/docs/riders/guides/authentication/introduction#common-problems-and-solutions

这里的任何安全专家谁可以帮忙? 最好的问候,马特

PS:我也把这个问题发布在我用来提出这些请求的Uber库上,但是到目前为止,似乎没有人能够帮助我。 https://github.com/shernshiou/node-uber/issues/70

编辑:以下图片显示我的身份validation设置到目前为止:

在这里输入图像描述

我find了解决scheme。 我认为这是图书馆本身的问题。 因为一旦我用http请求库( https://github.com/request/request )发出请求,它就起作用了。 在你的代码的顶部包括:

 var request = require('request'); 

OAuth2和SSO accessToken都起作用。 你应该给这个方法一个pickup纬度和经度pickup,你从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); } }); } 

我希望这可以帮助别人。