SASL authentication DIGEST-MD5 failed解决办法

转载请注明出处,谢谢:http://blog.csdn.net/harryweasley/article/details/52949261

最近在维护公司一个带有聊天功能的项目,发现了一个bug,用户每次点击推送消息进入应用,就再也登录不上了,并且报如下错误:SASL authentication DIGEST-MD5 failed。

这个聊天功能,通过aSmack.jar包实现的。

调用XMPPConnection.login(String username, String password, String resource)方法来进行登录,与服务器获取连接。这里的password就是从服务器得到的token值,最后通过分析之所以出现这个bug,是因为我登录的token值和获取的token不一样了。

第一次登录的时候,客户端从服务端获取到token,利用该token进行登录了;第二次用户点击推送消息进入客户端,客户端再次从服务端获取到token,但是并没有用该token来登录服务端,而是用第一次登录的token,那么就会报这样的错误了,SASL authentication DIGEST-MD5 failed。

为了检测获取到服务的token和登录token是否一致,首先找到客户端获取到服务端的token代码,将其打印出来,然后找到xmppManager登录时候要传入的token值,
XMPPConnection.login(String username, String password, String resource)

打印出这里的password,看两次是否一致,如果不一致,就说明你的token登录有问题,看看是代码的哪里出错了,导致最新的token值没有赋值到。

我自己的项目出错的原因是,UCNotificationService服务启动后,在其onCreate()方法中初始化了UCXmppManager类,而password是在UCXmppManager的构造函数赋值的,当用户点击推送消息再次打开客户端,因为UCNotificationService服务已经启动,那么它的onCreate()将不会再次执行了,所以导致新的token没有赋值给password,所以报错:SASL authentication DIGEST-MD5 failed。解决办法,就是在UCNotificationService服务的onStartCommand()方法中,将最新的从服务获取的token值复制给password。

猜你喜欢

转载自blog.csdn.net/HarryWeasley/article/details/52949261