zoukankan      html  css  js  c++  java
  • 微信二维码登录的原理

    在电脑上使用微信时,你可能已经发现微信不提供传统的账号密码登陆,取而代之的是通过扫描二维码进行登陆。今天就要研究下次登陆方式微信时如何实现的?

    1、每次用户打开PC端登陆请求,系统返回一个唯一的uid,并将uid的信息绘制成二维码返回给用户。这里的uid一定是唯一的,否则就会造成你登陆了其他用户的账号或者其他用户登陆你的账号。

    2、当用户使用登陆后的微信扫描该二维码的时候,会将这个uid和手机上的微信账号及密码产生的token进行绑定,并上传到服务器

    3、WEB通过JS不断的向后端发起请求,查询有没有关于uid的登陆记录(uid和token是否存在于服务器上)。实现代码可以从微信页面获取:

        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毫秒之后重新发起请求。

    类似微信登陆场景应用场景还是很多,比如通过二维码进行设备间的授权。比如使用手机遥控 装有android系统的电视盒等。

    引用地址:http://www.biaodianfu.com/weixin-qrcode.html
  • 相关阅读:
    Vue 2.x windows环境下安装
    VSCODE官网下载缓慢或下载失败 解决办法
    angular cli 降级
    Win10 VS2019 设置 以管理员身份运行
    XSHELL 连接 阿里云ECS实例
    Chrome浏览器跨域设置
    DBeaver 执行 mysql 多条语句报错
    DBeaver 连接MySql 8.0 报错 Public Key Retrieval is not allowed
    DBeaver 连接MySql 8.0报错 Unable to load authentication plugin 'caching_sha2_password'
    Linux系统分区
  • 原文地址:https://www.cnblogs.com/csn0721/p/3581297.html
Copyright © 2011-2022 走看看