2011-09-22 6 views
7

Ho passato la maggior parte di oggi a provare ad implementare l'API XAuth di Instapaper. Non sono ancora riuscito a ottenere un token oauth.API Instapaper e Javascript XAuth

Qualche idea su cosa sto facendo male?

Sto usando node.js e il modulo oauth. Sono a conoscenza del fatto che ho bisogno di passare il nome utente, la password, la modalità amd come parametri aggiuntivi. E il modulo oauth dovrebbe occuparsi di tutti i parametri oauth. Ma non lo è. Ecco il codice:

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

E restituisce questo:

{ statusCode: 401, 
    data: 'oauth_signature [pWRf4W9k9nogID/O90Ng29bR2K0=] does not match expected value [eqJ8zD1bKeUa3InpDyegGDAbSnM=]' } 'oauth_signature [pWRf4W9k9nogID/O90Ng29bR2K0=] does not match expected value [eqJ8zD1bKeUa3InpDyegGDAbSnM=]'} 
+0

sto ancora sbattere la testa contro questo . Per favore aiuto. –

+0

Hai mai funzionato? Pubblicare una soluzione di lavoro o contrassegnare una soluzione come risposta corretta sarebbe ottima –

risposta

5

Quindi io non sono sicuro se questo è un errore con il modulo oauth o se le API di Instapaper è troppo severo nel parsing dei Authorization intestazioni, ma ho dovuto aggiungere uno spazio dopo la virgola per il delimitatore di intestazione. In ogni caso sembra che questo causi tutti i problemi (400 errori).

OAuth attualmente accumula intestazioni come:

oauth_consumer_key=SomeKey,oauth_consumer_secret=SomeSecret... 

doveva essere

oauth_consumer_key=SomeKey, oauth_consumer_secret=SomeSecret... 

ho modificato il file oauth.js per riflettere questo. https://github.com/ciaranj/node-oauth/blob/master/lib/oauth.js#L121

aggiunto uno spazio dopo la virgola verso la fine della linea

authHeader+= "" + this._encodeData(orderedParameters[i][0])+"=\""+ this._encodeData(orderedParameters[i][1])+"\", "; 

Qui è il mio lavoro campione cliente:

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

    }); 

}); 

Spero che questo aiuti!

+0

Questo è ancora un campione "funzionante"? Sembra che non funzioni, dal momento che la firma per "getOAuthAccessToken" è cambiata, a meno che non ci sia qualcosa che mi manca. –

+0

Paul (e tutti gli altri che affrontano lo stesso problema come me), è possibile utilizzare 'getOAuthRequestToken (x_auth_params, callback)' (testato con node-oauth v0.9.8). La correzione con spazi mancanti nell'intestazione Autorizzazione è ancora necessaria. Assicurati di impostare requestUrl anche quando crei una nuova istanza di OAuth, (per 'https: // www.instapaper.com/api/1/oauth/access_token'). –

1

La risposta di Derek riguarda lo spazio mancante come problema, ma non è necessario modificare oauth.js.

Dopo aver creato il cliente OAuth, basta impostare la stringa di separazione:

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

(sì, "separatore", c'è un errore di battitura nel codice del modulo)