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=]'}
So I am not sure whether this is an error with the
oauth
module or if Instapaper's API is too strict in parsing theAuthorization
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:
needed to be
I modified the
oauth.js
file to reflect this. https://github.com/ciaranj/node-oauth/blob/master/lib/oauth.js#L121added a space after the comma towards the end of the line
Here is my working client sample:
Hope this helps!
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:
(yes, "sepErator", there's a typo in the module's code)