Spark & Openfire的认证流程

Spark的登录:LoginDialog.login()方法

1. 生成一个SessionManager

2. 生成一个XMPPConnection对象

3. 然后用XMPPConnection建立连接并初始化:生成socket,并建好它的reader/writer

4. 然后调用XMPPConnection.login()方法,为了简化,先把SASL抛一边,看看smack怎么用NonSASLAuthentication来做认证

5. 会对密码作digest,避免直接传password. 作digest时会用connectionId当盐

6. 发出认证请求,服务端返回用户名

7. 最后把服务端返回的用户名更新到connection.user中, 设置connection.authenticated = true, anonymous = false

再来看看spark如何使用身份信息,以 Roster.reload()为例(刷新好友列表)

1. packetWriter.sendPacket(packet)发出packet,packet里面不会掺杂用户身份信息。

2. 服务端收到消息后,其中一步是在ClientStanzaHandler.processMessage()中执行 packet.setFrom(session.getAddress()),把身份消息塞入Packet

引用

<iq id="psg6P-8" type="get" from="kent@someServer/Spark 2.6.3">

  <query xmlns="jabber:iq:roster"/>

</iq>

也就是说服务端直接把用户的身份信息放在服务端的mina session对象里,要用时再从session里把用户信息取出来

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.