腾讯的网站如何检测到你的 QQ 已经登录?(异构系统单点登录 SSO(single-sign-on))
腾讯网站检测QQ已经登录,实现快速登录,是典型的异构系统单点登录 SSO(single-sign-on)技术。腾讯用NPAPI实现的。
查看源码,ptlogin 的 js文件发现用ActivexObject浏览器插件。
q_hummerQtrl = new ActiveXObject(“SSOAxCtrlForPTLogin.SSOForPTLogin2″);
但ActiveX是IE插件,不支持Chrome,FireFox。腾讯使用了古老的 NPAPI(Netscape Plugin Application Programming Interface)接口。NPAPI 几乎支持所有主流浏览器,包括 FireFox、Chrome、Opera(IE 从 5.5 后停止支持 NPAPI,转而使用 ActiveX)。
打开 chrome://plugins/发现自动登录插件Tencent SSO Platform(QQ QuickLogin Helper)
在路径 C:\Program Files (x86)\Common Files\Tencent\TXSSO\Bin下SSO 的动态链接库。
np前缀表示np插件,npSSOAxCtrlForPTLogin.dll,按照NPAPI插件编程的写法,放在浏览器会加载的地方,用的时候写个标签就可以在 js 里面调用了。于是跨浏览器(无视 IE)的插件开发变得相当可行。运行在 NPAPI 插件中的代码拥有当前用户的所有权限,不在沙箱中运行,所以它的扩展程序在被 Chrome 网上应用店接受前要求人工审核。(不过今年年底Chrome将完全移除对NPAPI的支持,转而推广自己的NACL)
其他网站用这个插件来检测用户的QQ登录,create ActiveXObject 会加载失败。因为腾讯在 dll中就对域名进行了限制。但如果在host文件加一条:127.0.0.1 xui.ptlogin2.qq.com
再用 xui.ptlogin2.qq.com 这个域名去访问本地的这个html,就可以正常拿到 QQ 相关信息。说明判断域名的时候是在这个dll中判断的,所以网页无法篡改。腾讯对于域名限制挺严格的,如xue.ptlogin2.qq.com xue.ptlogin2.paipai.com等才能成功,而
www.qq.com就不成功了。这些域名都指向同一个服务器,202.106.195.30,说明腾讯用户信息使用独立服务器。
以前通过IE加载项InstallHelper Class 和SSOForPTLogin2 Class实现,但查看IE加载项:
没有发现SSOForPTLogin2 Class,估计AccountProtectBHO Class有关。
网上有几种错误的猜测:
①保存在Cookie或文件中,用js读,但浏览器有沙箱功能,js一般无法读取。而且就算清空Cookie依然有效。
②服务器记录IP,CPU等硬件设备hash值,依赖环境过多,不可能。
③QQ 启动某端口监听,js 连接此端口。用 netstat 查看发现QQ 并没有监听。
单点登录机制:当用户第一次访问 ERP系统的时候,因为还没有登录,就被引导到认证中心进行登录(1);根据用户登录信息,认证中心进行身份验证,如果通过,就返回一票据(ticket)给用户(2);用户再访问其他应用系统的时候(3,5)就会带上这个票据,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证中心进行效验,检查ticket的是否合法(4,6)。如果通过效验,用户不需要重新登陆就可访问EFP系统和EIP系统了,即”一次登录,多方认证[2]”。
CAS 最基本的协议过程:
1、支持多浏览器的插件:FireBreath(新技术,建议采用)、NPAPI(Mozilla官网,太老了)
2、京东的sso:Cookie方式,登陆后保存为ceshi3.com的cookie值,将该值加密后得到参数C,用js将C值发送到所有京东域名下,如sso.360top.com/sign? c=……,sso.jcloud.com/sign? c=……,所有域名都使用统一的凭据,这样就实现了。
3、sina微博SSO:与Yale-CAS原理一致。
4、淘宝的SSO:用JS获取跨域的cookie,tmall向taobao页面发送请求,淘宝获取当前域下所有cookie,然后合并成js代码发给tmall。tmall采用 jsonp 的方式跨域加载该 js 代码,检测taobao的cookie,判断是否登陆。为避免其他页面恶意获取cookie,淘宝只有Referer为自己分站时才返回数据。
5、CAS是开源的SSO解决方案,应用最广,基于cookies来存储用户(TGT)Ticket,如果CS客户端,使用 CAS 的 RestFul API 来进行登录验证,或者webservice。CAS是java的,但客户端可以用.net,但依赖性太强,应仔细研究,并用.net实现CAS的基本功能的SSO。
6、 Authorization可以用DotNetOpenAuth 实现SSO
7、OAuth 2.0协议,开放授权
8、构建RESTful服务