我正在尝试为我将要开发的基于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不同。这有什么问题?
答案 0 :(得分:1)
您没有宣传对资源绑定的支持,因此客户端无法完成会话设置。看来Pidgin决定回到jabber:iq:auth(pre-XMPP样式),如果服务器不支持XMPP样式的流设置。
您需要查看http://tools.ietf.org/html/rfc6120#section-7,因为“XMPP客户端和服务器实现中需要支持资源绑定”。并且“流的各方必须将资源绑定视为强制性协商。”
虽然通过查看其他实现所做的事情来实现XMPP,而不是遵循规范,但这不是一个好主意,有时一瞥另一个实现的流可以在你遇到这样的问题时提供线索。