xmpp java websocket_Websocket整合登录XMPP的思考

在上一篇文章里面提到过,由于websocket使用的是类socket方式与xmpp服务进行交互,因此没有办法像bosh那样在web后台先登录成功后,然后利用返回的sid和rid进行会话还原。那现在就是要思考使用websocket的前端怎么实现用户在web上登录成功了,websocket登录xmpp服务器也一并成功呢?而且还要实现用户切换刷新web页面,xmpp会话不掉线呢?

最初我想的是,是否要重新自定义xmpp的SASL身份验证协议或修改websocket流程?后来参考OAuth2.0协议,想到的是是否可以给登录成功的web用户发行token,然后xmpp的SASL的身份验证采用这个发行的token来进行验证登录呢?结合openfire 4.2.3我做了一下实践,效果还算不错。具体时序图如下:

7c5152e3e2486d81357610d61f260cb5.png

xmpp身份验证SASL协议,使用的是DIGEST-MD5方式验证,由于由web端控制token的发行和时效,只要用户web session超时,或用户退出,那么token就失效,因此保证了用户帐户的安全性。

而对于实现用户切换刷新web页面不退出,就是反复登录;用户进入一个web页面就调用API获取一下web端的token,再用token重新登录一下xmpp实现不掉线。但这也有一个缺点就是会造成传统的xmpp客户端在接收这个用户状态时,会提示过多的下线上线信息,但这些对于高度定制化的客户端来说是可以修改的,整体功能影响不大。

49f06dae215f48f7dfaf47f2d2c6be40.png

如果服务器是openfire的话,这里提供修改源代码的思路:

添加插件,使用setProperty方法设置对应的继承org.jivesoftware.openfire.auth.JDBCAuthProvider类的Auth Provider。JiveGlobals.setProperty("provider.auth.className", "com.example.TokenAuthProvider");

重写JDBCAuthProvider的getPassword(String username)方法.

踩过的坑: 对于这个我们实现的TokenAuthProvider类,最好封装为JAR包放入安装openfire的lib目录下面,方便openfire加载引用。否则直接写入插件JAR包中,可能导致过段时间后openfire加载TokenAuthProvider类失败,就变成加载DefaultAuthProvider类,最终SASL身份验证失败的问题。

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值