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=]'}
The Simple Instapaper API allows third-party applications to add URLs to Instapaper. If you want to do more than adding URLs from your application to an Instapaper customer's account, use the Full API. Use of the Simple API constitues agreement to the API Terms of Use.
Full Developer API The Instapaper API allows third-party applications to add URLs to Instapaper. If you only need to add URLs from your application to an Instapaper customer's account, consider using the Simple API. Use of the API constitutes agreement to the API Terms of Use.
Instapaper strings are always encoded in UTF-8, and Instapaper expects all input to be in UTF-8. Unless otherwise noted, output from every method is an array. The output array is returned as JSON by default.
About Instapaper credentials Every user has a unique username, which is almost always an email address. Passwords are notrequired, though most users do use one. Any interface prompting the user for credentials must accommodate this -- for example, you cannot assume that an empty password is a user error.
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': '[email protected]'
};
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With