2012-03-20 21 views
8

Estoy tratando de conectarme a Gmail a través de su IMAP API. Estoy usando node-imap library de Bruno Morency para eso. Para crear el oauth_signature, timestamp y nonce utilizo another library.Conexión a la API IMAP de Gmail en javascript/node.js

Para ser más específicos: El propietario del recurso ya ha autenticado al consumidor. Así que tengo un secreto de acceso + token. Por supuesto, también tengo el token secreto del consumidor. Entonces, lo que quiero es iniciar sesión con el mecanismo XOAuth descrito here (encabezado: SASL Initial Client Request).

Al ejecutar el código me sale un error:

Error while executing request: Invalid credentials d43if2188869web.36 

Me pregunto lo que estoy haciendo mal. De hecho, puede haber más razones. Codificación incorrecta de base64 (aunque la codificación probablemente funcione bien ya que se obtiene un error diferente para codificación diferente, estoy bastante seguro de que no es así), cálculo de firma incorrecto (ACTUALIZACIÓN: Probé esto ahora con http://oauth.net/core/1.0a/#sig_base_example), cálculo incendible u otros.

que pueden autenticarse utilizando las mismas credenciales (consumo + ressource-propietario) en una aplicación de java, por lo que las credenciales son más probablemente no sea la causa del error (codificación simplemente incorrecto/firma cálculo)

Finalmente el código. He omitido la clave del consumidor + secreto ni el token + secreto del propietario del recurso por razones obvias).

var oauth_version = "1.0"; 
var oauth_timestamp = OAuth.timestamp(); 
var oauth_nonce = OAuth.nonce(6); //random nonce? 

var oauth_consumer_key = "NOTFORYOU"; //validated 
var oauth_consumer_secret = "NOTFORYOU"; //validated 
var oauth_token = "NOTFORYOU"; //validated 
var oauth_token_secret = "NOTFORYOU"; //validated 
var email = "NOTFORYOU"; //validated 

var oauth_signature_method = "HMAC-SHA1"; 
var method = "GET"; 
var action = "https://mail.google.com/b/" 
    +email 
    +"/imap/"; //gmail's request url 

//signature 
var oauth_signature_method = "HMAC-SHA1"; //from https://developers.google.com/google-apps/gmail/oauth_protocol 

//example values for validating signature from  http://oauth.net/core/1.0a/#sig_base_example 
oauth_consumer_key="dpf43f3p2l4k3l03"; 
oauth_nonce="kllo9940pd9333jh"; 
oauth_signature_method="HMAC-SHA1"; 
oauth_timestamp="1191242096"; 
oauth_token="nnch734d00sl2jdk"; 
oauth_version="1.0"; 
action="http://photos.example.net/photos?file=vacation.jpg&size=original"; 
method="GET"; 

//signature 
var signature_basestring_parameters = { 
    oauth_version: oauth_version 
    , oauth_consumer_key: oauth_consumer_key 
    , oauth_timestamp: oauth_timestamp 
    , oauth_nonce: oauth_nonce 
    , oauth_token: oauth_token 
    , oauth_signature_method: oauth_signature_method 
} 

//var signature_basestring = oauth_consumer_key+"&"+oauth_token_secret; 
var signature_basestring = OAuth.SignatureMethod.getBaseString({method: method, action: action, parameters: signature_basestring_parameters}); 

var methodName = oauth_signature_method; 
var signer = OAuth.SignatureMethod.newMethod(methodName, { 
        consumerSecret: oauth_consumer_secret, 
        tokenSecret: oauth_token_secret 
       } 
        ); 
console.log("signature_basestring=["+signature_basestring+"]"); 

var oauth_signature = signer.getSignature(signature_basestring); 

console.log("oauth_signature=["+oauth_signature+"]"); 

oauth_signature=OAuth.percentEncode(oauth_signature); 

console.log("(escaped) oauth_signature=["+oauth_signature+"]"); //prints out tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D as in the [example](http://oauth.net/core/1.0a/#sig_base_example) 

//base-string 
var baseStringDecoded = "GET" 
    + " " 
    + "https://mail.google.com/b/"+email+"/imap/" 
    + " " 
    + "oauth_consumer_key=\""+oauth_consumer_key+"\"," 
    + "oauth_nonce=\""+oauth_nonce+"\"," 
    + "oauth_signature=\""+oauth_signature+"\"," 
    + "oauth_signature_method=\""+oauth_signature_method+"\"," 
    + "oauth_timestamp=\""+oauth_timestamp+"\"," 
    + "oauth_token=\""+oauth_token+"\"," 
    + "oauth_version=\""+oauth_version+"\""; 

var baseString = Base64.encode( //base64 from http://www.webtoolkit.info/javascript-base64.html 
    baseStringDecoded 
); 


//create imap connection 
var imap = new ImapConnection({ 
        host: 'imap.gmail.com', 
        port: 993, 
        secure: true, 
        debug: true, 
        xoauth: baseString 
       }); 

ACTUALIZACIÓN: He encontrado un example cómo generar la cadena de firma de base. basado en esto, cambié mi código. En consecuencia, ahora obtengo los mismos resultados para la firma (generación de cadena base para la firma, cálculo del valor de la firma, porcentaje de codificación del valor de la firma) como en el ejemplo. Esto significa que soy (es decir, la biblioteca oauth utilizada) lo más probable es que calcule el oauth_signature de una manera correcta y que algo más vaya mal.

Respuesta

2

Finalmente tuve éxito. Mi problema al final fue que cambié la clave en oauth.js para probar el ejemplo oaut, al volver a hacer el trabajo.

Así que el ejemplo anterior ahora debería funcionar para autenticarse en la API IMAP de gmail

Cuestiones relacionadas