IM开发【5】 - 使用email作为用户名登陆openfire

53 篇文章 0 订阅
49 篇文章 0 订阅
首页 » 即时通信 » IM开发之使用email作为用户名登录openfire

IM开发之使用email作为用户名登录openfire

日期:2010-05-25作者:firefish分类:即时通信阅读:3,242评论:5

现在有很多网站特别是贴上了“WEB2.0”标签的网站采用电子邮件地址作为用户名,个中缘由,本文不进行讨论。openfire 本文要说的是,当你的网站使用了email作为用户名,而后又基于XMPP协议搭建了一个IM(即时通信)系统,你希望用网站的用户帐号直接登录IM(本blog的另外一篇日志《使用django的用户帐号登录openfire》对系统的基本搭建有较为详细的描述,可参考之),这里面会存在一个小小的问题需要进行一些特殊的处理。

到底是什么呢?呃,问题就出在email里的这个”@”符号上。在XMPP中@被定义为有着特殊用途的符号,XMPP的用户名被称为JID,JID由三个部分组成,像这样:test@abc.com/resource。你看到了,JID中包含一个@,@前面的是用户名,后面的是所在的域,斜杠后面的resource表示当前使用的客户端的名字。

所以,很明显的,email里的@和JID里的@冲突了!当然XMPP作为一个牛X的IM协议,它已经考虑到了这一点,它在扩展协议XEP-0106里进行了定义。

它的解决方案是将用户名里的特殊字符进行转义。也就是客户端在获得用户的登录名之后,进行一个转换,如此就可以保证发送到服务器的JID是没有冲突的合法字符串了。XMPP定义的特殊字符处理@之外还有其它的几个,有兴趣的同学请猛击这里围观XEP-0106:JID Escaping。

openfire目前已经支持了XEP-0106,函数定义在org.xmpp.packet.JID里,分别是escapeNode和unescapeNode。客户端我使用的是gloox的API,在1.0版里,gloox也增加了对XEP-0106的支持,在jid.cpp里可以找到这两个函数。如果你使用的是其它的不支持XEP-0106的客户端开发包,也很简单,自己按照协议的定义,写两个函数就好了。

有了这两个函数就好办了,首先在客户端取得用户输入的email,调用escapeNode函数对字符串进行转义,将转义后的字符串作为用户名发送登录请求。比如用户名是test@gmail.com,转义后则变成为test\40@gmail.com。

openfire在收到请求之后,会调用验证函数(请参考本blog的另外一篇日志《使用django的用户帐号登录openfire》实现自定义的验证)authenticate,该函数使用客户端提供的用户名密码到用户表去查询用户。那么我们需要做的是,在查询数据库之前,将转义过的@符号再转回来即可,像下面这样:

username = JID.unescapeNode(username);

另外一个处理用户信息的类,也就是表ofproperty的provider.user.className所指向的类,该类的loadUser函数,也需要对username进行同样的处理。

好了,经过这两步简单的处理,你现在可以用email作为用户名来登录基于openfire的IM系统了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值