可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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)