Websocket整合登录XMPP的思考

发表于:2018-07-30 17:39:45,已有1818次阅读

上一篇文章里面提到过,由于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我做了一下实践,效果还算不错。具体时序图如下:
websocket整合登录

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

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

如果服务器是openfire的话,这里提供修改源代码的思路:
添加插件,使用setProperty方法设置对应的继承org.jivesoftware.openfire.auth.JDBCAuthProvider类的Auth Provider。

JiveGlobals.setProperty("provider.auth.className", "com.example.TokenAuthProvider");

重写JDBCAuthProvidergetPassword(String username)方法.

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

参考:

分享到:

扫一扫,用手机观看!

用微信扫描还可以

分享至好友和朋友圈

二维码分享
评论

暂无评论

您还可输入120个字