QQ网页微信二维码登陆原理分析

最近在分析QQ和微信的登陆过程中,发现存在了二维码登陆这个东西,比较疑惑其实现,作了一下简单的分析。

二维码说的直白一点就是包含二进制数据的黑白图片。当进行登录时,服务器生成一条二维码信息,发送给PC客户端。这时,手机终端(已经存在指定账号登录信息)扫描二维码,会将这条二维码信息与自身登录账户的相关信息发送至服务器,服务器就授权接收二维码的PC客户端进行登录。比如网页微信:打开wx.qq.com网页(https形式),就是一个二维码登陆页面,通过手机终端登陆的微信进行扫描,然后就能自动登陆了。这里和一些朋友推送方面的猜想不同,保持的是一个短连接。

通过分析数据包发现在网页存在的情况下,客户端会不间断的向服务器发起https连接,并且传输很少的数据之后就断开连接了。在网页的源代码中,找到了一个js文件“login18002b.js”。其中的代码

	function _poll(_asUUID) {
		var _self = arguments.callee,
            _nTime = 0;
		_sCurUUId = _asUUID;

        _logInPage("_poll Request Start, time: " + new Date().getTime());
        _nTime = new Date().getTime();
		$.ajax({
		type: "GET",
		url: "https://login." + _sBaseHost + "/cgi-bin/mmwebwx-bin/login?uuid=" + _asUUID + "&tip=" + show_tip,
		dataType: "script",
		cache: false,
		timeout: _nAjaxTimeout,
		success: function(data, textStatus, jqXHR) {
            _logInPage("_poll Request Success, code: " + window.code + ", time: " + (new Date().getTime() - _nTime) + "ms");
			switch (_aoWin.code) {
			case 200:
                _sSecondRequestTime = new Date().getTime() - _sSecondRequestTime;
                _logInPage("Second Request Success, time: " + _sSecondRequestTime + "ms");
				clearTimeout(_oResetTimeout);

				$.get(_aoWin.redirect_uri + "&fun=new", function(msg) {
                    _logInPage("new func reponse, reponseMsg: " + msg);
                    _reportNow("new func reponse, reponseMsg: " + msg);
					var code = msg.match(/<script>(.*)<\/script>/);
					if(code){
						eval(code[1]);
					}else{
						$("#container").show();
						$("#login_container").hide();
					}
				});

                _reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Success, uuid: " + _asUUID + ", time: " + _sSecondRequestTime + "ms");
				break;

			case 201:
                clearTimeout(_oResetTimeout);
				show_tip = 0;
				$('.errorMsg').hide();
				$('.normlDesc').hide();
				$('.successMsg').show();
                _logInPage("First Request Success");
                _reportNow("/cgi-bin/mmwebwx-bin/login, First Request Success, uuid: " + _asUUID);
//                setTimeout(function(){
                    _logInPage("Second Request Start");
                    _reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Start, uuid: " + _asUUID);

                    _sSecondRequestTime = new Date().getTime();

                    _nAjaxTimeout = 5 * 1000;
                    _self(_asUUID);
//                }, 500);
                break;

			case 408:
				setTimeout(function(){
					_self(_asUUID);
				}, 500);
				break;

			case 400:
			case 500:
                _reset();
                _afterLoadWebMMDo(function(){
					_aoWin.Log.d("500, Login Poll Svr Exception");
				});
				break;
			}
		},
		error: function(jqXHR, textStatus, errorThrown) {
			if (textStatus == 'timeout') {
                setTimeout(function(){
                    _self(_asUUID);
                }, 500);
			} else {
                setTimeout(function(){
                    _self(_asUUID);
                }, 5000);

                _logInPage("_poll Request Error:" + textStatus);
                _afterLoadWebMMDo(function(){
                    _aoWin.Log.e("Login Poll Error:" + textStatus);
                });
			}
		}
		});
	}

很清晰的说明了接下来的处理方式:网页客户端每500毫秒就向服务器发起ssl请求,请求当前二维码的登陆信息,如果返回结果201,则说明已经获取扫描二维码终端相同的账号登陆授权,再其它一部分情况下,将在500毫秒之后继续发起请求。

最后,对qq二维码登陆也做了一个简单的分析,QQ二维码登陆将会通过udp 8000端口频繁的向服务器发送询问请求,一直到二维码被扫描正确登陆或者二维码超时为止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值