查看文章 |
飞信分析之九:飞信登录时的身份验证
2007年09月20日 20:41
作者: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。 好啦,分析到现在我们可以做一个飞信的客户端了,哈,谁有兴趣? ;) |
最近读者: