Instapaper API & Javascript XAuth

匿名 (未验证) 提交于 2019-12-03 08:41:19

问题:

I've spent most of today try to implement Instapaper's XAuth API. I haven't even been able to get an oauth token, yet.

Any ideas what I'm doing wrong?

I'm using node.js and the oauth module. It's my understanding that I need to pass the username, password, amd mode as extra parameters. And the oauth module should take care of all of the oauth parameters. But it's not. Here's the code:

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) });

And it returns this:

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

回答1:

So I am not sure whether this is an error with the oauth module or if Instapaper's API is too strict in parsing the Authorization headers, but I had to add a space after the comma for the header delimiter. At any rate this seems to be causing all the issues (400 errors).

oauth currently builds up headers as:

oauth_consumer_key=SomeKey,oauth_consumer_secret=SomeSecret...

needed to be

oauth_consumer_key=SomeKey, oauth_consumer_secret=SomeSecret...

I modified the oauth.js file to reflect this. https://github.com/ciaranj/node-oauth/blob/master/lib/oauth.js#L121

added a space after the comma towards the end of the line

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

Here is my working client sample:

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);    });  });

Hope this helps!



回答2:

Derek's answer is right about the missing space as being the problem, but you don't need to edit oauth.js.

After creating the OAuth client, just set the separator string:

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

(yes, "sepErator", there's a typo in the module's code)



转载请标明出处:Instapaper API & Javascript XAuth
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!