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=]'}
所以我不确定这是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”,模块的代码中有一个错字)