Withings API 无法使用 node-oauth

Withings API is not working with node-oauth

我正在尝试对 Withings API using node-oauth 的请求进行身份验证,这是一个广泛使用的 Node.js OAuth 模块。 OAuth 流程的所有初始步骤都有效,我能够获取用户 ID、访问令牌和访问令牌机密。但是,当尝试实际使用这些令牌发出经过身份验证的请求时,我收到以下错误之一:

我已通过测试验证我使用的凭据有效 here。是我做错了什么,还是 Withings API 以某种非标准方式实现,这使得它与 node-oauth 不兼容?

var consumerKey = "";
var consumerSecret = "";
var oauth_access_token = "";
var oauth_access_token_secret = "";
var userid = "";

var oauth = require("oauth");

var withings = new oauth.OAuth(
    "https://oauth.withings.com/account/request_token",
    "https://oauth.withings.com/account/access_token",
    consumerKey,
    consumerSecret,
    "1.0",
    null,
    "HMAC-SHA1"
);

var url = "http://wbsapi.withings.net/measure?action=getmeas&userid=" + userid;
withings.get(url, oauth_access_token, oauth_access_token_secret, function(error, response) {
    console.log(response);
});

输出:

{"status":2554}

withings API可能有点特别,也很任性。例如,如果您没有以正确的顺序发送查询字符串中的选项,您有时会遇到错误。我没有尝试使用 node-oauth,因为我在 angular 中使用它,而我的朋友在 Rails 中使用它,但是很难让它工作。

我没有看到你的回调 url 在 node-oauth 的选项中发送 你是否在 Withings 应用程序的选项中更改了它?

您可以尝试修改 node-oauth 以记录对 Withings 的每次调用的响应,并查看失败的是第一个、第二个还是第三个。

祝你好运;)

我想通了。 node-oauth 库假定大多数 API 都希望在 headers 中定义 OAuth 参数。但是,OAuth 参数也可以在查询字符串中定义,这就是 Withings 决定实现它的方式。 node-oauth 库为此目的定义了一个 signUrl 函数,但您必须显式使用它。一旦将 URL 包装在该函数中,问题就解决了。请注意,不需要将访问令牌传递给 get 函数,因为请求已经签名。

var url = withings.signUrl("http://wbsapi.withings.net/measure?action=getmeas&userid=" + userid, oauth_access_token, oauth_access_token_secret);
withings.get(url, null, null, function(error, response) {
    console.log(response);
});

检查您的 url 可能是您遗漏了任何必需的参数,例如 acces_token.

样本URL: https://wbsapi.withings.net/measure?action=getmeas&category=1&access_token=XXXXXxxxxxxxxXXXXX&meastype=1&startdate=1543581749&enddate=1543581750