2011-09-22 8 views
7

Pasé la mayor parte del día intentando implementar la API XAuth de Instapaper. Ni siquiera he podido obtener una ficha de Oauth todavía.Instapaper API y Javascript XAuth

¿Alguna idea de lo que estoy haciendo mal?

Estoy usando node.js y el módulo oauth. Tengo entendido que necesito pasar el nombre de usuario, la contraseña y el modo amd como parámetros adicionales. Y el módulo oauth debería ocuparse de todos los parámetros oauth. Pero no lo es. Aquí está el código:

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

y devuelve esto:

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

Todavía estoy golpeando mi cabeza contra esta . Por favor ayuda. –

+0

¿Alguna vez lo hiciste funcionar? Publicar una solución de trabajo o marcar una solución como la respuesta correcta sería genial –

Respuesta

5

Así que no estoy seguro de si esto es un error con el módulo oauth o si la API de Instapaper es demasiado estricta al analizar los Authorization cabeceras, pero tuve que agregar un espacio después de la coma para el delimitador del encabezado. En cualquier caso, esto parece estar causando todos los problemas (400 errores).

oauth construye actualmente hasta encabezados como:

oauth_consumer_key=SomeKey,oauth_consumer_secret=SomeSecret... 

necesitaba ser

oauth_consumer_key=SomeKey, oauth_consumer_secret=SomeSecret... 

he modificado el archivo oauth.js para reflejar esto. https://github.com/ciaranj/node-oauth/blob/master/lib/oauth.js#L121

añade un espacio después de la coma hacia el final de la línea

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

Aquí está mi ejemplo de cliente de trabajo:

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

    }); 

}); 

Espero que esto ayude!

+0

¿Sigue siendo una muestra "operativa"? Parece que no funciona, ya que la firma del "getOAuthAccessToken" ha cambiado desde entonces, a menos que haya algo que me falta. –

+0

Paul (y todos los demás que enfrentan el mismo problema que yo), puede usar 'getOAuthRequestToken (x_auth_params, callback)' en su lugar (probado con node-oauth v0.9.8). La corrección con espacios faltantes en el encabezado Authorization sigue siendo necesaria. Sin embargo, asegúrese de establecer requestUrl al crear una nueva instancia de OAuth (a 'https: // www.instapaper.com/api/1/oauth/access_token'). –

1

La respuesta de Derek es correcta sobre la falta de espacio como problema, pero no es necesario editar oauth.js.

Después de crear el cliente de OAuth, acaba de establecer la cadena de separación:

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

(sí, "separador", no es un error tipográfico en el código del módulo)