2012-03-20 12 views
8

Sto provando a connettermi a gmail tramite il suo IMAP API. Sto usando Bruno Morency node-imap library per quello. Per creare la oauth_signature, timestamp e nonce, utilizzo another library.Connessione all'API IMAP di Gmail in javascript/node.js

Per essere più specifici: il proprietario del prodotto ha già autenticato il consumatore. Quindi ho un token + segreto d'accesso. Naturalmente ho anche il token segreto del consumatore. Quindi, quello che voglio è effettuare il login con il meccanismo XOAuth descritto here (intestazione: SASL Initial Client Request).

Quando si esegue il codice ottengo un errore:

Error while executing request: Invalid credentials d43if2188869web.36 

mi chiedo che cosa sto facendo male. In realtà potrebbero esserci più motivi. Codifica base64 errata (anche se la codifica probabilmente funziona proprio da quando si ottiene un errore diverso per codifica diversa, sono abbastanza sicuro che non lo è), calcolo della firma errato (UPDATE: l'ho testato ora con http://oauth.net/core/1.0a/#sig_base_example), calcolo nonce o altro.

mi può autenticare usando le stesse credenziali (Consumer + ressource-proprietario) in un'applicazione Java, quindi le credenziali sono molto probabilmente non la causa dell'errore (codifica solo sbagliato/firma calcolo)

Infine il codice. Ho omesso il segreto + chiave del consumatore né il token del proprietario di risorsa + segreto per ovvi motivi).

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

AGGIORNAMENTO: ho trovato un example come generare la stringa firma di base. sulla base di questo ho cambiato il mio codice. Di conseguenza, ora ottengo gli stessi risultati per la firma (generando la stringa di base per la firma, il calcolo del valore della firma, il valore della firma della codifica percentuale) come nell'esempio. Ciò significa che sono (vale a dire la libreria oauth utilizzata) che molto probabilmente calcola la oauth_signature nel modo giusto e qualcos'altro sta andando storto.

risposta

2

Finalmente ci sono riuscito. Il mio problema alla fine è stato che ho cambiato la chiave in oauth.js per testare l'esempio di oauth, cambiarlo ha fatto il lavoro.

Così l'esempio sopra dovrebbe ora lavorare per autenticare l'API gmail IMAP

Problemi correlati