Подключение к API Gmail IMAP в javascript / node.js - PullRequest
9 голосов
/ 21 марта 2012

Я пытаюсь подключиться к gmail через IMAP API .Для этого я использую библиотеку node-imap Бруно Моренси .Для создания oauth_signature, timestamp и nonce я использую другую библиотеку .

Если быть более точным: владелец ресурса уже аутентифицировал потребителя.Так что у меня есть токен доступа + секрет.Конечно, у меня также есть секретный ключ + токен потребителя.Так что я хочу войти в систему с помощью механизма XOAuth, описанного здесь (заголовок: SASL Initial Client Request).

При выполнении кода я получаю ошибку:

Error while executing request: Invalid credentials d43if2188869web.36

Интересно, что я делаю не так?На самом деле может быть больше причин.Неправильная кодировка base64 (хотя кодирование, вероятно, работает правильно, поскольку вы получаете другую ошибку для другой кодировки, я почти уверен, что это не так), неверный расчет подписи (ОБНОВЛЕНИЕ: я проверял это сейчас с http://oauth.net/core/1.0a/#sig_base_example), nonce calculation или другими.

Я могу аутентифицироваться, используя те же учетные данные (потребитель + владелец ресурса) в 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
              });

ОБНОВЛЕНО: я нашел пример , как генерировать базовую строку подписи,На основании этого я изменил свой код.Соответственно, теперь я получаю те же результаты для подписи (генерирование базовой строки для подписи, вычисление значения подписи, процентное значение кодировки подписи), как в примере.Это означает, что я (то есть используемая библиотека oauth), скорее всего, правильно вычисляю oauth_signature, а что-то еще идет не так.

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Наконец мне это удалось.В итоге моя проблема заключалась в том, что я изменил ключ в oauth.js для тестирования примера oauth, вернув его обратно, выполняя свою работу.

Так что приведенный выше пример теперь должен работать для аутентификации в IMAP API gmail

1 голос
/ 21 марта 2012

Если вы думаете, что это связано с кодировкой, посмотрите Как сделать кодировку Base64 в node.js? для bas64 узла вместо webtoolkit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...