簡體   English   中英

無法使用node.js和node-xmpp連接到GTalk

[英]Unable to connect to GTalk with node.js and 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僅允許OAuth2Google 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中的錯誤)。

您發送的XML確實無效:

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

它使用auth名稱空間前綴而不在任何地方定義它。

Google對OAuth授權的描述有一個示例,其中包括名稱空間聲明( 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開發人員。

這是0.10.9中引入的node-xmpp中的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM