7

今日はほとんどの時間を 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=]'}
4

2 に答える 2

5

したがって、これがモジュールのエラーなのか、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);

  });

});

お役に立てれば!

于 2012-03-10T08:29:38.617 に答える