Я пытаюсь подключиться к GTalk, используя node.js и node-xmpp. Вместо успешного подключения node-xmpp возвращает ответ об ошибке XML.
Подготовка
$node -v
v0.10.24
$npm install node-stringprep
$npm install node-xmpp
$npm list
...
├─┬ [email protected]
...
gtalk.js
var xmpp = require('node-xmpp');
var sys = require("sys");
var options = {
jid: "[email protected]",
password: "mygooglepassword"
//,host: "talk.google.com"
//,port: 5222
};
var jabber = new xmpp.Client(options);
jabber.on('online', function() {
console.log("Connected");
});
jabber.on('error', function(e) {
sys.puts(e);
});
Ошибка
$node gtalk.js
<stream:error xmlns:stream="http://etherx.jabber.org/streams"><invalid-xml xmlns="urn:ietf:params:xml:ns:xmpp-streams"/></stream:error>
Возможные объяснения
Неправильный идентификатор/пароль (вход на веб-сайте Google работает)node-xmpp требуется хост/порт для подключения к GTalk (попробовал talk.google.com/5222)talk.google.com@5222 неверен (заголовок Google Doc Open Com говорит, что это правильно)GTalk разрешает только OAuth2 (Google Doc Open Com говорит, что SASL PLAIN разрешен для «устаревших» устройств)Это то же самое, что и StackOverflow#4349577 (нет такой же опечатки)Я неправильно использую node-xmppGTalk не отвечает должным образом- node-xmpp содержит ошибки
/не поддерживает GTalk
Я почти уверен, что исключаю 1-5, и я был бы рад услышать другие объяснения или доказательства для 6-8. Спасибо!
Обновления
<сильный>1. Поток XML ("=>" исходящий, "‹=" входящий)
=> <stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" to="gmail.com">
<= <stream:stream from="gmail.com" id="C2AA8A4648B596A1" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client"><stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"><required/></starttls><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-OAUTH2</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism></mechanisms></stream:features>
=> <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
<= <proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
=> <stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" to="gmail.com">
<= <stream:stream from="gmail.com" id="3D42C6DC5985A9E6" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">
<= <stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-OAUTH2</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism><mechanism>PLAIN</mechanism></mechanisms></stream:features>
=> <auth auth:service="oauth2" xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="X-OAUTH2">AGNvaW2iaXRzeUBnbWFpbC5jb12AdW5kZWZpbmVk</auth>
<= <stream:error><invalid-xml xmlns="urn:ietf:params:xml:ns:xmpp-streams"/></stream:error>
Кажется, node-xmpp пытается использовать OAUTH2, хотя я вообще не предоставил никакого токена. Вместо этого следует использовать PLAIN.
<сильный>2. пример node-xmpp oauth тоже не работает
Создан токен OAUTH2 в соответствии с запросом на вытягивание node-xmpp #85.
$node node_modules/node_xmpp/examples/echo_bot_oauth.js [email protected] oauth2token
No usable SASL mechanism
<сильный>3. Добавление preferred:"PLAIN"
устраняет проблему с подключением
изменение параметров на
var options = {
jid: "[email protected]",
password: "mygooglepassword",
preferred: "PLAIN"
};
исправляет ошибку и, похоже, успешно аутентифицируется. Это может свидетельствовать об объяснении №8 (ошибка в node-xmpp).