Xmpp学习之Smack发送消息JID变乱码

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载请表明出处:http://www.jianshu.com/p/9230b8217d07

快速导航,简单来个目录图片。

图片
图片

前言

上一篇博客Android平台使用Smack后,这次咱们来分享一下在集成过程中SASL认证的一些坑=_=。

在此为后面的smack学习做笔记,以作备忘。
以下是本次采用的Demo环境:

  • Openfire 3.8.2
  • smack 4.2.1

登录成功后发现jid变成 乱码@乱码

一般发生这种问题,在登录时是没问题的,但是当你想发送消息时,你会发现接收消息方的名字居然是乱码,下面我来说一下为什么会登录成功,但是发送消息乱码。

解决方案

解决方案很简单,仅需在调用connection.Login()函数前先调用SASLAuthentication.blacklistSASLMechanism("ANONYMOUS");,把ANONYMOUS加入黑名单即可,下面讨论一下为什么会发生这种情况。

如何证实

如何证实呢?咱们来看一下连接socket后的第二条报文:

<?xml version='1.0' encoding='UTF-8'?>
    <stream:stream xmlns:stream="http://etherx.jabber.org/streams" 
    xmlns="jabber:client" from="im" 
    id="e26ece26" 
    xml:lang="en" 
    version="1.0">
    <stream:features>
        <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls">
        </starttls>
        <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
            <mechanism>PLAIN</mechanism>
            <mechanism>ANONYMOUS</mechanism>
            <mechanism>JIVE-SHAREDSECRET</mechanism>
        </mechanisms>
        <compression xmlns="http://jabber.org/features/compress">
            <method>zlib</method>
        </compression>
        <auth xmlns="http://jabber.org/features/iq-auth"/>
        <register xmlns="http://jabber.org/features/iq-register"/>
    </stream:features>

从上面的报文可以看到服务器支持的 SASL 认证机制只有三种(你们的服务器不一定和我返回的认证机制一样,这里只是打个比方),但是当你想设置PLAIN认证方式时,你会在API中发现居然没有设置唯一认证方式,且无法设置优先级,因为ANONYMOUS的排序比PLAIN的顺序前,所以SDK直接返回了ANONYMOUS,下面来看一下SASLAuthentication的Sasl认证是怎么做的:

Iterator<SASLMechanism> it = REGISTERED_MECHANISMS.iterator();
final List<String> serverMechanisms = getServerMechanisms();
       、、、
// Iterate in SASL Priority order over registered mechanisms
while (it.hasNext()) {
    SASLMechanism mechanism = it.next();
    String mechanismName = mechanism.getName();
            、、、
            、、、
    if (serverMechanisms.contains(mechanismName)) {
        /* Create a new instance of the SASLMechanism 
        for every authentication attempt.
        return*/
         mechanism.instanceForAuthentication(connection, 
        configuration);
    }

通过以上源码咱们发现,无非就是String.contains()函数进行匹配字符串,那么问题来了,如果ANONYMOUS的排序比PLAIN的顺序前,则直接返回ANONYMOUS,怎么看到系统的SASLMechanism排序呢?咱们再来看下面的log:

W/System.err: org.jivesoftware.smack.SmackException: 
No supported and enabled SASL Mechanism provided by server. 
Server announced mechanisms: 
[PLAIN, ANONYMOUS, JIVE-SHAREDSECRET].
 Registerd SASL mechanisms with Smack: [
    SASL Mech: 
        SCRAM-SHA-1-PLUS, Prio: 100, 
        SASL Mech: SCRAM-SHA-1, Prio: 110, 
        SASL Mech: DIGEST-MD5, Prio: 210, 
        SASL Mech: PLAIN, Prio: 410, 
        SASL Mech: X-OAUTH2, Prio: 410, 
        SASL Mech: ANONYMOUS, Prio: 500, 
        SASL Mech: EXTERNAL, Prio: 510
]. Enabled SASL mechansisms for this connection: [PLAIN]. 
Blacklisted SASL mechanisms: [PLAIN, SCRAM-SHA-1-PLUS].

相信大家看到上面的log已经发现问题所在了,Prio是优先级,ANONYMOUS的优先级明显高于PLAINDIGEST-MD5X-OAUTH2等。

小知识

ANONYMOUS级别官方解释是,匿名登录,所以产生的JID是随机生成的。

结尾

本篇博客简单描述了如何解决SASL认证的一个小坑,欢迎支持。

引用

最新的smack接入指南链接:https://download.igniterealtime.org/smack/docs/latest/documentation/gettingstarted.html/

最新版smack JavaDoc链接:https://download.igniterealtime.org/smack/docs/latest/javadoc/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,292评论 19 139
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。转载请表明出处:http://www.jianshu.com/...
    Cavalier123阅读 8,314评论 0 12
  • 一、Smack库概述     Smack是一个开源、易用的XMPP/Jabber客户端库,它使用Java语言开发,...
    AndryYu阅读 11,414评论 2 13
  • 关于XMPP最权威的讲解:http://www.jabbercn.org/RFC3920(这个才是最权威的,下面文...
    随风飘荡的小逗逼阅读 5,389评论 1 5
  • 今日话题:咪蒙的文章《说来惭愧,我的助理月薪才5万》 黄小污:超出预期 安迪:情绪调节 先列出来,以免我忘记了。 ...
    时光蜜糖阅读 3,203评论 0 50