Instapaper API&Javascript XAuth

我今天大部分时间都在尝试实现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=]'} 

Solutions Collecting From Web of "Instapaper API&Javascript XAuth"

所以我不确定这是oauth模块的错误,还是Instapaper的API在parsingAuthorization头文件时太严格,但是我必须在头文件分隔符的逗号后面加一个空格。 无论如何,这似乎是造成所有问题(400错误)。

oauth目前build立标题为:

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

希望这可以帮助!

Derek的回答是关于作为问题的缺失空间是正确的,但是你不需要编辑oauth.js

创buildOAuth客户端后,只需设置分隔符string:

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

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