0

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 Webサイトでのログインは機能します)
  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 をサポートしていません

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 プル リクエスト #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 内のバグ) の証拠である可能性があります。

4

2 に答える 2

0

これは、0.10.9 で導入された node-xmpp のバグです。

于 2014-01-23T14:37:59.817 に答える
0

あなたが送信した XML は確かに無効です:

<auth auth:service="oauth2"
      xmlns="urn:ietf:params:xml:ns:xmpp-sasl"
      mechanism="X-OAUTH2">
  ...
</auth>

auth名前空間プレフィックスをどこにも定義せずに使用しています。

OAuth 認証に関する Google の説明に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 開発者に報告されるべきです。

于 2014-01-22T16:48:22.123 に答える