黔优媒体网-软文媒体自助发稿平台!
  1. 行业资讯
  2. 正文

详解二维码登录的原理

来源:黔优媒体网   时间:2024-09-19

这篇文章主要大家详细解析了微信qq的二维码登录原理js代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在很多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈骗就不说了),二维码验证,多终端辅助授权应用开始多起来,这里先说下啥是二维码,其实二维码就是存了二进制数据的黑白图片,当出现要求二维码登录的时候,服务器会生成一条临时的唯一的二维码信息,发送到客户端以二维码(图片)的形式写入到网页,然后你就会看到统一的四个方形的二维码,如果做的好这个二维码信息应该是有时效的,这里暂且不考虑这些,就简单的微信登录作为例子看看吧:

首先说下整个授权流程:

在客户端网页中会不断向服务器发送https连接,并且这里传输很少的数据之后就断开连接了,下面看下微信网页中这个login1c709c.js文件:

(function($, _aoWin) {
 _aoWin.QRLogin = {};
 _aoWin.LoginLog = 
 var _sBaseHost = ,
 _oLoginQrCodeImg = document.getElementById( loginQrCode 
 if (document.domain == qq.com ) {
 _sBaseHost = weixin.qq.com 
 } else if(location.hostname.match(/(wechat\.com)$/)){
 _sBaseHost = wechat.com 
 }else{
 _sBaseHost = wechatapp.com 
 var show_tip = 1,
 _sCurUUId,
 _oResetTimeout,
 _aWebMMCallbacks = [],
 _oDetactWebMMInterval = setInterval(function(){
 if(_aoWin.WebMM){
 clearInterval(_oDetactWebMMInterval);
 var callback;
 while(callback = _aWebMMCallbacks.shift()){
 if(typeof(callback) != function ) continue;
 callback();
 }, 1000);
 function _logInPage(_asLog){
 _aoWin.LoginLog = LoginLog + _asLog + \n 
 function _afterLoadWebMMDo(callback){
 if(!_aoWin.WebMM){
 _aWebMMCallbacks.push(callback);
 }else{
 callback();
 function _reportNow(text){
 _logInPage(text);
 _afterLoadWebMMDo(function(){
 WebMM.ossLog({Text: text});
 WebMM.flushOssLog();
 var reLoadQRImgCount = 0,
 loadQRCodeTime = 0,
 loadQRImgSucc = function(){
 clearInterval(loadQRImgWatchDog);
 _logInPage( Load QRCode Success, time= + (new Date().getTime() - loadQRCodeTime) + ms, reload count: + reLoadQRImgCount);
 loadQRImgFail = function(img){
 _reportNow( Load QRcode fail! + status + , src: + img.src + , time: + (new Date().getTime() - loadQRCodeTime) + ms 
 loadQRImgWatchDog = null;
 function _loadQRImg(uuid) {
 _poll(uuid);
 _logInPage( Load QRCode Start 
 loadQRCodeTime = new Date().getTime();
 _oLoginQrCodeImg.onload = function(){
 loadQRImgSucc();
 _oLoginQrCodeImg.onload = null;
 _oLoginQrCodeImg.onerror = function(){loadQRImgFail(this)};
 _oLoginQrCodeImg.src = https://login. +_sBaseHost+ /qrcode/ +uuid+ ?t=webwx 
 loadQRImgWatchDog = setInterval(function(){
 if (reLoadQRImgCount = 5) {
 _reset();
 return;
 reLoadQRImgCount++;
 var _img = new Image();
 _img.onload = function () {
 if(!_oLoginQrCodeImg.onload) return;
 _oLoginQrCodeImg.onload = null;
 _oLoginQrCodeImg.src = this.src;//replace
 loadQRImgSucc();
 _img.onerror = function(){loadQRImgFail(this)};
 _img.src = _oLoginQrCodeImg.src + r= + new Date().getTime();
 }, 5000);
 var _sSecondRequestTime = 0,
 _nAjaxTimeout = 100 * 1000,
 _nNewLoginFuncErrCount = 0;
 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);
 var _fNewLoginFunc = function(){
 $.ajax({
 url: _aoWin.redirect_uri + fun=new ,//new login page
 type: GET ,
 success:function(msg) {
 _logInPage( new func reponse, reponseMsg: + msg);
 var code = msg.match(/ script (.*) \/script 
 var skey=msg.match(/ skey (.*) \/skey 
 if(code){
 eval(code[1]);
 }else{
 $( #container ).show();
 $( #login_container ).hide();
 if(skey skey[1]){
 WebMM.model( account ).setSkey(skey[1]);
 error:function(jqXHR, textStatus, errorThrown){
 _nNewLoginFuncErrCount++;
 if(_nNewLoginFuncErrCount 5){
 if(confirm( Call new login page func error, refresh? )){location.reload()}
 return;
 _reportNow(_aoWin.redirect_uri + New login page func error: + textStatus + retryCount: + _nNewLoginFuncErrCount);
 setTimeout(_fNewLoginFunc, 500);
 _fNewLoginFunc();
 _reportNow( /cgi-bin/mmwebwx-bin/login, Second Request Success, uuid: + _asUUID + , time: + _sSecondRequestTime + ms 
 break;
 case 201:
 clearTimeout(_oResetTimeout);
 show_tip = 0;
 $( #39;.errorMsg #39;).hide();
 $( #39;.normlDesc #39;).hide();
 $( #39;.successMsg #39;).show();
 _reportNow( /cgi-bin/mmwebwx-bin/login, First Request Success, uuid: + _asUUID);
 _reportNow( /cgi-bin/mmwebwx-bin/login, Second Request Start, uuid: + _asUUID);
 _sSecondRequestTime = new Date().getTime();
 //_nAjaxTimeout = 5 * 1000;
 _self(_asUUID);
 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 == #39;timeout #39;) {
 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);
 var getUUIDCount = 0,
 _getUUIDWatchDog,
 _bGetUUIDSuccess = false;//ajax successִ
 function _getUUID() {
 getUUIDCount++;
 var _self = arguments.callee,
 _loadError = function(errorText){
 _reportNow( Load UUID Error! ErrorText: + errorText + getUUIDCount= + getUUIDCount);
 if(getUUIDCount 5){
 if (confirm( Load uuid error. Refresh? )) {
 location.reload();
 setTimeout(function(){
 _self();
 }, 500);
 clearTimeout(_getUUIDWatchDog);
 _getUUIDWatchDog = setTimeout(function(){
 if(!_aoWin.QRLogin.code){
 _logInPage( GetUUID Timeout, WatchDog Run 
 _self();
 }, 10000);
 $.ajax({
 type: GET ,
 url: https://login. + _sBaseHost + /jslogin?appid=wx782c26e4c19acffb redirect_uri= +encodeURIComponent(location.protocol+ // +location.host+ /cgi-bin/mmwebwx-bin/webwxnewloginpage )+ fun=new lang= + document.lang,
 dataType: script ,
 cache: false,
 success : function(){
 clearTimeout(_getUUIDWatchDog);
 if(_bGetUUIDSuccess) return;
 if (_aoWin.QRLogin _aoWin.QRLogin.code == 200) {
 _logInPage( GetUUID Success, UUID= + QRLogin.uuid);
 _bGetUUIDSuccess = true;
 clearTimeout(_oResetTimeout);
 _oResetTimeout = setTimeout(function(){
 location.reload();//Note: Don #39;t run _reset(). If you run _reset(), there will may have many _poll request, as they get 408 return code
 }, 5 * 60 *1000);//5 mins
 _loadQRImg(QRLogin.uuid);
 } else {
 var QRLoginCode = (_aoWin.QRLogin _aoWin.QRLogin.code) ? _aoWin.QRLogin.code : None 
 _logInPage( GetUUID Error, QRLogin.code= + QRLoginCode);
 _loadError( QRLogin.code= + QRLoginCode);
 error : function(xhr, textStatus, errorThrown){
 _logInPage( GetUUID Error, textStatus= + textStatus);
 _loadError(textStatus);
 function _reset(){
 location.reload();
 if ($( #login_container ).is( :visible ) ) {
 _getUUID();

_bHadLog = true; var _sUvid = document.cookie.match(new RegExp( (^| ) + webwxuvid + =([^;]*)(;|$) )); if(!_sUvid || _sUvid.length 3) return; _sUvid = _sUvid[2]; (new Image()).src = /cgi-bin/mmwebwx-bin/webwxstatreport?funkey=indexdemo uvid= +_sUvid+ uuid= +_sCurUUId;

_nTimer = setTimeout(function() { _oMask$.stop().animate({opacity:0}, function(){$( .mask ).hide()}); _oGuide$.stop().animate({marginLeft: -120px ,opacity:0}, 400 , swing ,function(){ _oGuide$.hide(); }, 100); /*guide*/ _oGuide$.css({ left : 50% , opacity :0}); _oGuideTrigger$.css({ backgroundColor : white , opacity : 0 }); _oGuideTrigger$.mouseover(function(){ clearTimeout(_nTimer); _oMask$.show().stop().animate({ opacity :0.2}); _oGuide$.css( display , block ).stop().animate({marginLeft: +168px , opacity:1}, 900, swing , function() { _oGuide$.animate({marginLeft: +153px }, 300); _ossLog(); }).mouseout(_back); _oGuide$.mouseover(function(){ clearTimeout(_nTimer); }).mouseout(_back); })(jQuery, window);

细读js之后,你就会从网页客户端这边看到请求登录的一面,网页客户端每隔500毫秒就向服务器发起ssl请求,请求当前的二维码是否被其他客户端(手机)授权,如果返回结果是201,就是说明已经获取扫描二维码终端相同的账号登录授权,如果是其他情况就再隔500毫秒再循环发请求。这个过程会一直持续到二维码被扫描通过或者二维码超时(失效)为止。
 【相关推荐】

1. 特别推荐:“php程序员工具箱”V0.1版本下载

2. 微信小程序完整源码下载

3. 微信小程序demo:仿网易云音乐

以上就是详解二维码登录的原理的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。


【免责申明】黔优媒体网以上展示内容来源于用户自主上传、合作媒体、企业机构或网络收集整理,版权争议与本站无关,文章涉及见解与观点不代表黔优媒体网官方立场,请读者仅做参考,本文标题:详解二维码登录的原理;欢迎转载,转载时请说明出处。若您认为本文侵犯了您的版权信息,或您发现该内容有任何违法/违规的内容,请您立即联系我们及时修正或删除。(邮箱号: kefu@qianu.com)
此操作需要登录,请先登录~
免费注册会员,尽享国内领先平台!