【问题标题】:Instapaper API & Javascript XAuthInstapaper API & Javascript XAuth
【发布时间】:2011-09-22 17:15:01
【问题描述】:

我今天大部分时间都在尝试实现 Instapaper 的 XAuth API。我什至还没有获得 oauth 令牌。

知道我做错了什么吗?

我正在使用 node.js 和 oauth 模块。据我了解,我需要将用户名、密码、amd 模式作为额外参数传递。 oauth 模块应该处理所有的 oauth 参数。但事实并非如此。代码如下:

var OAuth = require('oauth').OAuth;

var oauth = new OAuth(
  '',
  'https://www.instapaper.com/api/1/oauth/access_token',
  'CONSUMER_KEY',
  'CONSUMER_SECRET',
  '1.0',
  null,
  'HMAC-SHA1',
  null
);

var extra = {
  'x_auth_username': 'USERNAME',
  'x_auth_password': 'PASSWORD',
  'x_auth_mode': 'client_auth'
};
var hello = oauth._prepareParameters('', '', 'POST', 'https://www.instapaper.com/api/1/oauth/access_token', null);
var url = 'https://www.instapaper.com/api/1/oauth/access_token';
var f = true;
for (var i in hello) {
  if (f) {
    url += '?';
    f = false;
  } else {
    url += '&';
  }
  url += hello[i][0] + '=' + hello[i][1];
}
console.log(url+'&x_auth_mode=client_auth&x_auth_username=&x_auth_password=')
oauth._performSecureRequest('', '', "POST", url+'&x_auth_mode=client_auth&x_auth_username=&x_auth_password=', null, null, null, function(error, data, response) {
  console.log(error, data)
});

它返回这个:

{ statusCode: 401,
  data: 'oauth_signature [pWRf4W9k9nogID/O90Ng29bR2K0=] does not match expected value [eqJ8zD1bKeUa3InpDyegGDAbSnM=]' } 'oauth_signature [pWRf4W9k9nogID/O90Ng29bR2K0=] does not match expected value [eqJ8zD1bKeUa3InpDyegGDAbSnM=]'}

【问题讨论】:

  • 我仍然在努力解决这个问题。请帮忙。
  • 你有没有得到这个工作?发布一个可行的解决方案,或将解决方案标记为正确答案会很棒

标签: node.js oauth xauth instapaper


【解决方案1】:

所以我不确定这是 oauth 模块的错误,还是 Instapaper 的 API 在解析 Authorization 标头时过于严格,但我必须在标头分隔符的逗号后添加一个空格。无论如何,这似乎导致了所有问题(400 错误)。

oauth 目前将标头构建为:

oauth_consumer_key=SomeKey,oauth_consumer_secret=SomeSecret...

需要

oauth_consumer_key=SomeKey, oauth_consumer_secret=SomeSecret...

我修改了oauth.js 文件以反映这一点。 https://github.com/ciaranj/node-oauth/blob/master/lib/oauth.js#L121

在行尾的逗号后面加了一个空格

authHeader+= "" + this._encodeData(orderedParameters[i][0])+"=\""+ this._encodeData(orderedParameters[i][1])+"\", ";

这是我的工作客户示例:

var OAuth = require('oauth').OAuth;

var consumerKey    = 'chill';
var consumerSecret = 'duck';

var oa = new OAuth(
  null,
  'https://www.instapaper.com/api/1/oauth/access_token',
  consumerKey,
  consumerSecret,
  '1.0',
  null,
  'HMAC-SHA1'
);

var x_auth_params = {
  'x_auth_mode': 'client_auth',
  'x_auth_password': 'yourpass',
  'x_auth_username': 'yourusername@whatever.com'
};

oa.getOAuthAccessToken(null, null, null, x_auth_params, function (err, token, tokenSecret, results) {

  // CAN HAZ TOKENS!
  console.log(token);
  console.log(tokenSecret);

  // ZOMG DATA!!!
  oa.get("https://www.instapaper.com/api/1/bookmarks/list", token, tokenSecret,  function (err, data, response) {

    console.log(data);

  });

});

希望这会有所帮助!

【讨论】:

  • 这仍然是一个“工作”样本吗?似乎它不起作用,因为“getOAuthAccessToken”的签名已经改变,除非我遗漏了什么。
  • Paul(以及与我一样面临同样问题的其他所有人),您可以改用 getOAuthRequestToken(x_auth_params, callback)(使用 node-oauth v0.9.8 测试)。 Authorization 标头中缺少空格的修复仍然是必要的。不过,请确保在创建新的 OAuth 实例时也设置 requestUrl(到 https://www.instapaper.com/api/1/oauth/access_token)。
【解决方案2】:

关于缺少空格的问题,Derek 的回答是正确的,但您无需编辑 oauth.js

创建OAuth客户端后,设置分隔符字符串即可:

var OAuth = require('oauth').OAuth;
var oa = new OAuth({...});
oa._oauthParameterSeperator = ', ';

(是的,“sepErator”,模块代码中有错字)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    相关资源
    最近更新 更多