项目中需要 调用RPC 远程接口验证用户名密码,那么 默认的验证方式就不可以用了,需要动手修改。
看下面的文章之前,你需要下载一份openfire的源码。我的 是Openfire 3.9.3 客户端 是smack3.4
系统默认使用的 的 验证Provider 为 DefaultAuthProvider,我在authenticate 方法中打了断点,发现除了使用用户名密码登陆openfire的后台,其他的操作都不走这个断点,后来发现 默认的 验证是 DigestMD5Server 来验证的,客户端是根据服务器传回来的一个 证书(我们暂且这么叫) 然后客户端将密码用证书进行签名 得到一个新的字符串,然后将这个字符串给openfire openfire 从数据库拿到密码,然后使用相同的算法签名密码 然后比较两个字符串是否相同,如果相同则登陆成功。
如果我们要在服务器获取到用户名密码,必须将验证方式改为plain,那么如何修改呢? 很多人说改openfire的配置,我改了好久都没改出来,最后实验,改客户端
在登陆之前添加以下代码,将验证方式改为 palin
SASLAuthentication.supportSASLMechanism("PLAIN");
这样我们在 DefaultAuthProvider的authenticate 的断点就可以进了,我们阅读authenticate 方法的源码,发现,只要这个方法不抛异常 就代表验证成功,那么我们只需要改这里就可以实现 不读取数据库 远程验证的操作了。
因为plain 是明文 传输 ,所以一定要手动加密解密 密码。