转载自:
http://hi.baidu.com/nathan2007/blog/item/10645631faa0951aeac4afc5.html
作者:nathan
好久没搞这个了,现在根据一些朋友提出的问题继续分析好了。:)
飞信的整个登录过程包括取系统配置、验证身分、取联系人、取离线消息等等一堆过程,这里就不细述了,下面主要说明到是一些朋友比较关心的身份验证是怎么做的。
飞信有两处验证身份,第一次是通过SSL向SSIPortal登录时,第二次是用SIP协议向Proxy Server注册时。
一、向SSIPortal登录
SSI是啥,我一直没弄明白,是Single Sign-In? 习惯上不是SSO(Single Sign-On)吗?反正飞信一开始,必须向nav.fetion.com.cn登录,这是飞信的Portal。登录过程其实很简单,就是通过SSL做一个的GET,请求是:
https://nav.fetion.com.cn/ssiportal/SSIAppSignIn.aspx?mobileno=13XXXXXXXXX&pwd=XXXX
pwd就是这个用户的密码。服务器验证通过后,就会返回200 OK,Cookie中就有关键的SSIC了。SSIC应该是服务器给客户端的Credential,以后再跟服务器以Http的方式打交道,就必须带上这个Credential了,如下一步的可选操作Geturi:
POST /hds/geturi.aspx HTTP/1.1
User-Agent: IIC2.0/PC 2.1.0.0
Host: 221.130.45.205
Cookie: ssic=xxxxxxxxxxxxxxxx
Content-Length: 0
Connection: Keep-Alive
如果采用http方式而非tcp直连方式(连proxy server的8080端口),那么与服务器间的sip协议是用http承载的,每次都必须带上这个ssic。
这次登录除获得Credential外,还一个重要的作用就是获得用户的URI,即"sip:123456789@fetion.com.cn;p=xxxx".
二、向Proxy Server注册
完成上一步,就开始SIPC的交互过程了,首先用Register方法向Proxy Server注册,Proxy Server的地址(221.130.45.203)从哪来的,以前文章专门说过。
注册的过程是:
-----------------------------------------------------
xxx.xxx.xxx.xxx:xxx >>>>>>>> 221.130.45.203:8080
R fetion.com.cn SIP-C/2.0
F: 123456789
I: 1
Q: 1 R
L: 249
<args>.......</args>
-----------------------------------------------------
xxx.xxx.xxx.xxx:xxxx <<<<<<<< 221.130.45.203:8080
SIP-C/2.0 401 Unauthorized
I: 1
Q: 1 R
W: Digest algorithm="MD5-sess",nonce="xxxxxxxxxxxxxxxx"
-----------------------------------------------------
xxx.xxx.xxx.xxx:xxxx >>>>>>>> 221.130.45.203:8080
R fetion.com.cn SIP-C/2.0
F: 123456789
I: 1
Q: 2 R
A: Digest response="xxxxxxxxxxxxxxx",cnonce="xxxxxxxxxxxxxxxx"
L: 249
<args>......</args>
-----------------------------------------------------
xxx.xxx.xxx.xxx:xxxx <<<<<<<< 221.130.45.203:8080
SIP-C/2.0 200 OK
I: 1
Q: 2 R
X: 600
L: 877
<results>.....</results>
这是个标准的Digest Authentication验证过程,具体去看SIP或HTTP的文档好了:) 我们来关心"W"即WWWAuthenticate这个SIP Header Field,nonce是服务器给出的,那response和cnonce是怎么计算出来的呢?
计算response和cnonce需要用到sid(飞信号)、password、domain(fetion.com.cn或vodafone等用户所属域)、nonce。飞信计算cnonce是用了4个随机数组成一个16进制的字符串然后求这个字符串的MD5,responce的计算方法是:
1.求"sid:domain:passwd"这个utf8字符串的MD5值,得出key
2.求"key:nonce:cnonce"这个utf8字符串的MD5字符串,得出H1
3.求“REGISTER:sid"这个utf8字符串的MD5字符串,得出H2
4.求"H1:nonce:H2"这个utf8字符串的MD5字符串,即为response.
以上就是飞信的身分验证过程,我还没来得及写代码测试,应该就是这样子。另外,如果知道用户的URI,是否可以不用注册到SSIPortal?这个需要测试才知道,我看飞信中好象还对注册到SSIPortal的Session做了Keep Logon。
好啦,分析到现在我们可以做一个飞信的客户端了,哈,谁有兴趣? ;)
分享到:
相关推荐
手机飞信登陆信令流程 手机飞信登陆 手机飞信登陆
飞信飞信飞信飞信飞信飞信飞信飞信源码飞信源码飞信源码飞信源码飞信源码飞信源码飞信源码飞信源码飞信源码飞信源码
中国移动飞信协议分析,中国移动飞信协议分析
软件名称:Delphi版飞信GreenFetion源码 开发环境:WindowsXP,Delphi7 三方控件:Indy9(Delphi自带) 说明: 参考Php版飞信(http://sourceforge.net/projects/openfetion/)用Delphi实现了中国移动飞信2008协议的...
还是用回2006版,2008版的飞信程序太臃肿了,启动得慢。建议用回2006版的!!!
飞信.ppt飞信.ppt飞信.ppt飞信.ppt
从nathan在百度上发布《飞信协议分析》到现在也有3年了,且当时分析的是飞信2006版本。这中间变化太多,也使得我在写PHP版本飞信发送程序是走了很多弯路。 我曾经拜读过superli_198的《让 PHP 程序利用飞信...
(2) send()方法是有返回值的,可以通过分析文本判断是否发送成功。考虑到wap界面会改动,所以没有在类里写死关于发送成功的判断; (二)实现原理 1. 利用socket模拟登录wap版飞信,并模拟发送飞信,好处是不会...
命令行下使用的飞信. 可嵌入在程序中自动发送飞信短信. 使用方法: 1)进入Dos命令行 2)输入如下命令 sms -f ’您的手机号‘ -p ‘您的飞信密码’ -t ’目标手机号‘ -m ’你需要发送的消息‘ 其中您的手机号需要...
怎样借用移动飞信发免费手机短信 移动飞信协议分析与接口调用资料整理
n5230飞信 nokia 5230版 飞信 下载 5230 专用 版飞信 n5230 官方版 飞信 非通用版 诺基亚 5230 专用版 飞信n5230飞信 nokia 5230版 飞信 下载 5230 专用 版飞信 n5230 官方版 飞信 非通用版 诺基亚 5230 专用版 飞信
很好用的飞信很好用的飞信很好用的飞信很好用的飞信很好用的飞信很好用的飞信很好用的飞信很好用的飞信
C#飞信SDK2C#飞信SDK2C#飞信SDK2C#飞信SDK2C#飞信SDK2C#飞信SDK2C#飞信SDK2
迷你飞信 实现基本的收发短信和加好友功能 源码http://download.csdn.net/source/2609976
Wap飞信源码,在线飞信源码,PHP网页飞信源码
Linux飞信,Linux服务器实现飞信功能Linux飞信,Linux服务器实现飞信功能Linux飞信,Linux服务器实现飞信功能Linux飞信,Linux服务器实现飞信功能Linux飞信,Linux服务器实现飞信功能 Linux飞信包下载
飞信2008!·飞信2008!·飞信2008!·飞信2008!·飞信2008!·
飞信(Fetion) 教程之基础使用教程 飞信(Fetion)是中国移动推出的“综合通信服务”,即融合语音(IVR)、GPRS、短信等多种通信方式,覆盖三种不同形态(完全实时、准实时和非实时)的客户通信需求,实现互联网和移动网...
飞信有时候比较无耻,老让你更新,而且更新出来的新版本老多广告,很不爽,因为我用的还是奥运版的,每次登陆飞信PC端,都会提示“有新版本的飞信可以升级”,拒绝后每次登陆又会再出现,十分令人讨厌,而且它没有 ...
LibFetion封装飞信通信协议和功能处理逻辑,给开发者提供简洁、丰富的API接口。使用LibFetion的开发者只需专注于GUI(图形用户界面)的设计开发,就能轻易开发出飞信客户端,能大大提高飞信客户端的开发速度和降低开发...