Подключение к API IMAP Gmail в javascript / node.Яш
Я пытаюсь подключиться к Gmail через его API-ИНТЕРФЕЙС ПО ПРОТОКОЛУ IMAP. Я использую Бруно Моренси узел-библиотека imap для этого. Для создания oauth_signature, timestamp и nonce я использую библиотеке.
чтобы быть более конкретным: ressource-owner уже аутентифицировал потребителя. Итак, у меня есть секрет access-token+. Конечно, у меня также есть токен consumer's secret+. Итак, я хочу войти в систему с описанным механизмом XOAuth здесь (заголовок: SASL первоначальный запрос клиента).
при выполнении кода, я получаю сообщение об ошибке:
Error while executing request: Invalid credentials d43if2188869web.36
интересно, что я делаю неправильно. На самом деле причин может быть больше. Неправильная кодировка base64 (хотя кодировка, вероятно, работает правильно, так как вы получаете другую ошибку для другой кодировки, я уверен, что это не так), неправильный расчет подписи (обновление: я тестировал это сейчас сhttp://oauth.net/core/1.0a/#sig_base_example), nonce расчетливые или другие.
Я могу аутентифицироваться, используя те же учетные данные (потребитель+ressource-владелец) в приложении java, поэтому учетные данные, скорее всего, не являются причиной ошибки (просто неправильная кодировка/вычисление подписи)
наконец-то код. Я опустил ключ потребителя+секрет ни токен владельца ressource+секрет по понятным причинам).
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 ответов
наконец мне это удалось. Моя проблема в конце концов заключалась в том, что я изменил ключ в oauth.js для тестирования примера oauth, изменение его обратно выполнило эту работу.
таким образом, приведенный выше пример теперь должен работать для аутентификации в Gmail IMAP API
Если вы думаете, что это кодировка, связанная проверить Как сделать кодировку Base64 в узле.Яш? для bas64 узла вместо webtoolkit.