我正在尝试使用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
...
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(“=&gt;”outbound,“&lt; =”inbound)
=> <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中的错误)。
答案 0 :(得分:0)
您发送的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开发人员的错误。
答案 1 :(得分:0)
这是0.10.9中引入的node-xmpp中的错误。