2012-03-20 32 views
8

Tôi đang cố gắng kết nối với gmail qua IMAP API. Tôi đang sử dụng số node-imap library của Bruno Morency cho điều đó. Để tạo oauth_signature, dấu thời gian và nonce tôi sử dụng another library.Kết nối với Gmail IMAP API trong javascript/node.js

Để cụ thể hơn: Chủ sở hữu nguồn cấp dữ liệu đã xác thực người tiêu dùng. Vì vậy, tôi có mật khẩu truy cập + mã thông báo. Tất nhiên tôi cũng có mã bí mật của người tiêu dùng. Vì vậy, điều tôi muốn là đăng nhập bằng cơ chế XOAuth được mô tả here (tiêu đề: Yêu cầu khách hàng ban đầu của SASL).

Khi thực hiện đoạn code tôi nhận được một lỗi:

Error while executing request: Invalid credentials d43if2188869web.36 

Tôi tự hỏi những gì tôi đang làm sai. Trên thực tế có thể có nhiều lý do hơn. Mã hóa base64 sai (mặc dù mã hóa có thể hoạt động ngay từ khi bạn gặp lỗi khác nhau cho mã hóa khác nhau, tôi chắc chắn đây không phải là nó), tính chữ ký sai (UPDATE: Tôi đã thử nghiệm điều này ngay bây giờ với http://oauth.net/core/1.0a/#sig_base_example), tính toán nonce hoặc những người khác.

tôi có thể xác thực bằng cách sử dụng thông tin tương tự (người tiêu dùng + ressource-chủ sở hữu) trong một ứng dụng java, vì vậy thông tin nhiều nhất có lẽ không phải là nguyên nhân của lỗi (chỉ sai mã hóa/chữ ký tính)

Cuối cùng mã. Tôi đã bỏ qua chìa khóa của người tiêu dùng + bí mật không phải mã thông báo của chủ sở hữu thẻ + bí mật vì lý do rõ ràng).

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

CẬP NHẬT: Tôi tìm thấy một example cách tạo chuỗi chữ ký cơ sở. dựa trên điều này, tôi đã thay đổi mã của mình. Theo đó, bây giờ tôi nhận được kết quả tương tự cho chữ ký (tạo chuỗi cơ sở cho chữ ký, tính giá trị chữ ký, phần trăm mã hóa giá trị chữ ký) như trong ví dụ. Điều này có nghĩa là tôi (tức là thư viện oauth được sử dụng) hầu hết có thể tính toán oauth_signature theo đúng cách và điều gì đó khác đang xảy ra.

Trả lời

2

Cuối cùng tôi đã thành công. Vấn đề của tôi cuối cùng là tôi đã thay đổi khóa trong oauth.js để kiểm tra ví dụ oauth, thay đổi nó trở lại đã làm công việc.

Vì vậy, ví dụ ở trên giờ đây sẽ hoạt động để xác thực trên API IMAP của gmail

Các vấn đề liên quan