无法使用 node.js 和 node-xmpp 连接到 GTalk
Posted
技术标签:
【中文标题】无法使用 node.js 和 node-xmpp 连接到 GTalk【英文标题】:Unable to connect to GTalk with node.js and node-xmpp 【发布时间】:2014-01-22 16:09:10 【问题描述】:我正在尝试使用 node.js 和 node-xmpp 连接到 GTalk。 node-xmpp 没有成功连接,而是返回一个 XML 错误响应。
准备
$node -v
v0.10.24
$npm install node-stringprep
$npm install node-xmpp
$npm list
...
├─┬ node-xmpp@0.12.2
...
gtalk.js
var xmpp = require('node-xmpp');
var sys = require("sys");
var options =
jid: "mygoogleid@gmail.com",
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>
可能的解释
我很确定排除了 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 示例也不起作用
根据 node-xmpp pull request #85 创建 OAUTH2 令牌
$node node_modules/node_xmpp/examples/echo_bot_oauth.js gmailid@gmail.com oauth2token
No usable SASL mechanism
3.添加preferred:"PLAIN"
修复连接问题
将选项更改为
var options =
jid: "mygoogleid@gmail.com",
password: "mygooglepassword",
preferred: "PLAIN"
;
修复了错误,似乎验证成功。这可能是解释 #8 的证据(node-xmpp 中的错误)。
【问题讨论】:
该错误表明您正在以某种方式发送语法上无效的 XML。你能掌握实际发送到服务器的内容吗?不确定如何使用 node-xmpp 执行此操作,但 tcpdump 或 Wireshark 可能会有所帮助。 更新了捕获的 XML 流,看起来 node-xmpp 尝试使用 oauth2 进行身份验证,但 GTalk 不喜欢它? 【参考方案1】:您发送的 XML 确实无效:
<auth auth:service="oauth2"
xmlns="urn:ietf:params:xml:ns:xmpp-sasl"
mechanism="X-OAUTH2">
...
</auth>
它使用 auth
命名空间前缀,而没有在任何地方定义它。
Google's description of OAuth authorization 有一个包含命名空间声明(xmlns:auth
属性)的示例:
<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl"
mechanism="X-OAUTH2"
auth:service="oauth2"
xmlns:auth="http://www.google.com/talk/protocol/auth">
base64("\0" + user_name + "\0" + oauth_token)
</auth>
所以这可能应该作为一个错误报告给 node-xmpp 开发人员。
【讨论】:
xmlns:auth
确实不见了;但是它不应该首先使用 OAuth2。不知道它使用的令牌是如何生成的。所以它指向解释#8,我应该提交错误报告?
应该有一个选项让它更喜欢PLAIN
身份验证,虽然我无法通过快速的谷歌搜索找到任何。【参考方案2】:
这是 0.10.9 中引入的 node-xmpp 中的一个错误。
已提交问题 (https://github.com/node-xmpp/node-xmpp-client/issues/21) 已创建拉取请求 (https://github.com/node-xmpp/node-xmpp-client/pull/22) 拉取请求已合并。【讨论】:
以上是关于无法使用 node.js 和 node-xmpp 连接到 GTalk的主要内容,如果未能解决你的问题,请参考以下文章
XMPP BOSH 预绑定返回 SID 和 RID 的 Node.js 解决方案
如何使用 simple-xmpp/node-xmpp 获得 Jabber 用户的名册?
使用 node-xmpp 在节点中写入 Google CCS 服务器时出错