无法使用node.js和node-xmpp连接到GTalk

时间:2014-01-22 16:09:10

标签: javascript node.js xmpp google-talk node-xmpp

我正在尝试使用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. ID /密码错误(在Google网站上登录确实有效)
  2. node-xmpp需要主机/端口连接到GTalk (尝试过talk.google.com/5222)
  3. talk.google.com@5222 错误(Google Doc Open Com说错了)
  4. GTalk仅允许OAuth2 Google Doc Open Com表示“传统”设备允许使用SASL PLAIN)
  5. 这与StackOverflow#4349577 相同(没有相同的拼写错误)
  6. 我使用的是node-xmpp错误
  7. GTalk未按预期响应
  8. node-xmpp有错误 /不支持GTalk
  9. 我很确定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中的错误)。

2 个答案:

答案 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中的错误。