2012-03-20 16 views
8

GmailにIMAP APIで接続しようとしています。私はBruno Morencyのnode-imap libraryを使っています。 oauth_signature、timestamp、nonceを作成するにはanother libraryを使用します。javascript/node.jsのGmail IMAP APIに接続

具体的には、ressource-ownerはすでにコンシューマを認証しています。だから、私はアクセストークン+秘密を持っている。もちろん私は消費者の秘密+トークンも持っています。だから私が望むのは、here(見出し:SASL初期クライアント要求)というXOAuthメカニズムでログインすることです。

コードを実行すると、私はエラーを取得する:

Error while executing request: Invalid credentials d43if2188869web.36 

私は私が間違っているのだろうか。実際にはもっと理由があるかもしれません。間違ったbase64エンコーディング(エンコーディングは異なるエンコーディングで異なるエラーが発生している可能性がありますが、これはそうではないと確信しています)、不正なシグニチャ計算(更新:私はhttp://oauth.net/core/1.0a/#sig_base_exampleでこれをテストしました)資格情報は、おそらく最後に(計算だけで間違ったエンコーディング/署名)

コードエラーの原因ではありませんので

私は、同じ資格情報(消費+ ressource所有者)は、Javaアプリでを使用して認証することができます。私は消費者の鍵+秘密を省いても、明白な理由で所有者のトークン+秘密を再調達することもありません)。

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

UPDATED:exampleベースシグネチャ文字列の生成方法を見つけました。それに基づいてコードを変更しました。したがって、この例のように、シグネチャ(シグネチャのベースストリングの生成、シグネチャ値の計算、シグネチャの符号化率の計算)について同じ結果が得られます。つまり、私はoauth_signatureを正しい方法で計算し、他の何かが間違っていると思います(つまり、oauthライブラリが使用されています)。

答えて

2

最後に私は成功しました。最後に私の問題は、oauthの例をテストするためにoauth.jsのキーを変更し、それを元に戻していたということでした。

Gmail IMAP APIで上記の例が認証されるようになりました

1

エンコードに関連すると思われる場合は、webtoolkitではなくノードのbas64に対してHow to do Base64 encoding in node.js?をチェックアウトしてください。

+0

ありがとうございます。 – forste

関連する問題