invalid_grant 在应用程序中从 SSO 获取 access_token 时根据 OAuth2 请求

invalid_grant on OAuth2 request when obtaining access_token from SSO in App

我有一个带有 Uber API 集成的 iOS 应用程序,我在其中使用 SSO 对用户进行身份验证,然后将 accessToken 和 refreshToken 保存在我的设备本地。然后我调用我的服务器,它使用 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。我是在验证自己还是错误地设置了 Uber 客户端?甚至可以在执行 OAuth2 身份验证的超级客户端上使用我的 SSO accessToken 和 refreshToken 吗?我认为访问令牌和刷新令牌应该与 Uber 发回的用于 SSO 和 OAuth2 的令牌相同。 我正在使用开发人员帐户执行此操作,因此我实际上应该拥有请求端点的所有必需权限,但我之前也在应用程序中正确获得了它们。

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

这里有安全专家可以提供帮助吗? 此致, 马特

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

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

我找到了解决办法。我认为是图书馆本身的问题。因为一旦我使用 "request" 库 (https://github.com/request/request) 通过 http 发出请求,它就起作用了。在代码顶部包括:

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);
        }
    });
}

我希望这对某人有所帮助。