XMPP SASL身份验证

时间:2014-09-07 15:44:12

标签: xmpp sasl

我正在尝试为我将要开发的基于XMPP的应用程序创建一个XMPP服务器库。 我一直试图用普通的SASL来验证客户端。我已经在http://tools.ietf.org/html/rfc6120#section-6.4.6

阅读了RFC

我的问题是,在发送< success />,接收并发送新的开放标记和空功能列表之后,客户端(Pidgin)继续使用非SASL身份验证进行身份验证。这是通信的日志(<<>表示传入,>>传出):

<<  <?xml version='1.0' ?><stream:stream to='127.0.0.1' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>

>>  <?xml version="1.0" ?>
>>  <stream:stream version="1.0" xmlns="jabber:server" xmlns:stream="http://etherx.jabber.org/streams" id="kanapka" from="127.0.0.1">
>>  <stream:features>
>>  <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
>>  <mechanism>
>>  PLAIN
>>  </mechanism>
>>  </mechanisms>
>>  </stream:features>

<<  <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN' xmlns:ga='http://www.google.com/talk/protocol/auth' ga:client-uses-full-bind-result='true'>AHRlc3R1c2VyAHRlc3RwYXNz</auth>

>>  <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />

<<  <stream:stream to='127.0.0.1' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>

>>  <?xml version="1.0" ?>
>>  <stream:stream version="1.0" xmlns="jabber:server" xmlns:stream="http://etherx.jabber.org/streams" id="hotdog" from="127.0.0.1">
>>  <stream:features />

<<  <iq type='get' id='purple46cbc043'><query xmlns='jabber:iq:auth'><username>testuser</username></query></iq>

我还没有使用TLS,也没有尝试过任何其他SASL机制。这都是纯文本。

这是相同的TCP连接,流的ID不同。这有什么问题?

1 个答案:

答案 0 :(得分:1)

您没有宣传对资源绑定的支持,因此客户端无法完成会话设置。看来Pidgin决定回到jabber:iq:auth(pre-XMPP样式),如果服务器不支持XMPP样式的流设置。

您需要查看http://tools.ietf.org/html/rfc6120#section-7,因为“XMPP客户端和服务器实现中需要支持资源绑定”。并且“流的各方必须将资源绑定视为强制性协商。”

虽然通过查看其他实现所做的事情来实现XMPP,而不是遵循规范,但这不是一个好主意,有时一瞥另一个实现的流可以在你遇到这样的问题时提供线索。