3

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

  • 2554错误的操作或错误的网络服务
  • 2555发生未知错误
  • 2556服务未定义

我已经通过在此处测试它们验证了我使用的凭据是有效的。我做错了什么,还是 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}
4

3 回答 3

4

我想出了这个。node-oauth 库假定大多数 API 都希望在标头中定义 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);
});
于 2015-02-23T20:19:46.657 回答
0

withings API 可能有点特别,而且非常反复无常。例如,如果您没有以正确的顺序发送查询字符串中的选项,则有时会出现错误。我没有尝试过使用 node-oauth,因为我在 Angular 中使用它,而我的朋友在 Rails 中使用它,但很难让它发挥作用。

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

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

祝你好运 ;)

于 2015-02-23T19:29:05.807 回答
0

检查您的网址可能是您错过了任何必需的参数,例如 acces_token。

示例网址: https://wbsapi.withings.net/measure?action=getmeas&category=1&access_token=XXXXXxxxxxxxxXXXXX&meastype=1&startdate=1543581749&enddate=1543581750

于 2018-11-30T12:58:05.403 回答