ios - 在 App 中从 SSO 获取 access_token 时 OAuth2 请求上的 invalid_grant

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

我有一个带有 Uber API 集成的 iOS 应用程序,我在其中使用 SSO 对用户进行身份验证,然后将 accessToken 和 refreshToken 保存在我的本地设备上。然后我调用我的服务器,它使用 javascript 后台函数调用 node-uber ( https://www.npmjs.com/package/node-uber ) 库向 Uber 发出请求。 到目前为止,我正在尝试使用来自 SSO 登录的 2 个本地 token 设置 super 客户端,如下所示:

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 身份验证的 super 客户端上使用我的 SSO accessToken 和 refreshToken 吗?我认为访问 token 和刷新 token 应该与 Uber 发回的用于 SSO 和 OAuth2 的 token 相同。 我正在使用开发人员帐户执行此操作,因此我实际上应该拥有请求端点的所有必需权限,但我之前也在应用程序中正确获得了它们。

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

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

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

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

enter image description here

最佳答案

我找到了一个解决方案。我认为是图书馆本身的问题。因为一旦我使用带有“请求”库(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);
        }
    });
}

我希望这对某人有帮助。

关于ios - 在 App 中从 SSO 获取 access_token 时 OAuth2 请求上的 invalid_grant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46839986/

相关文章:

swift - Xcode 中声明的字段、方法和函数的大纲或列表

ios - 删除 SwiftyJSON 数组中的字典记录

ios - 运行干净后应用程序暂停但未收到错误

iOS 类似 Web UI

iphone - iOS 处理多个异步请求 : Send a Signal When All Requests Are Finished

Node.js 异步 |从 api 插入 postgresql 数据库结果

node.js - 如何在 SailsJS/Waterline 适配器方法中获取 DB 对象?

ios - 为什么我的 iPad 触摸事件会延迟(有时长达一秒)?

javascript - 如何保护 Node webkit 应用程序上的字体?

ios - 在 Swift 中从 IBOutletCollection 获取项目