国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Rumah applet WeChat pembangunan WeChat 微信二維碼登錄中的JS代碼分析

微信二維碼登錄中的JS代碼分析

Apr 02, 2017 pm 02:17 PM
kod js WeChat

在很多地方就是都出現(xiàn)了使用二維碼登錄,二維碼付款,二維碼賬戶等應用(這里的二維碼種馬,詐騙就不說了),二維碼驗證,多終端輔助授權(quán)應用開始多起來,這里先說下啥是二維碼,其實二維碼就是存了二進制數(shù)據(jù)的黑白圖片,當出現(xiàn)要求二維碼登錄的時候,服務器會生成一條臨時的唯一的二維碼信息,發(fā)送到客戶端以二維碼(圖片)的形式寫入到網(wǎng)頁,然后你就會看到統(tǒng)一的四個方形的二維碼,如果做的好這個二維碼信息應該是有時效的,這里暫且不考慮這些,就簡單的微信登錄作為例子看看吧,

首先說下整個授權(quán)流程:

在客戶端網(wǎng)頁中會不斷向服務器發(fā)送https連接,并且這里傳輸很少的數(shù)據(jù)之后就斷開連接了,下面看下微信網(wǎng)頁中這個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();
 }
 
  
 var _bHadLog = false;
 function _ossLog() {
 if (_bHadLog) return;
 _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;
 }
 
 
 if($("img.guide").length > 0) {
 var _nTimer = 0,
  _oGuide$ = $(".guide"),
  _oGuideTrigger$ = $("#guideTrigger, #tipTrigger"),
  _oMask$ = $(".mask");
 
  function _back() {
  _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之后,你就會從網(wǎng)頁客戶端這邊看到請求登錄的一面,網(wǎng)頁客戶端每隔500毫秒就向服務器發(fā)起ssl請求,請求當前的二維碼是否被其他客戶端(手機)授權(quán),如果返回結(jié)果是201,就是說明已經(jīng)獲取掃描二維碼終端相同的賬號登錄授權(quán),如果是其他情況就再隔500毫秒再循環(huán)發(fā)請求。這個過程會一直持續(xù)到二維碼被掃描通過或者二維碼超時(失效)為止。
?其中使用的工具有: 抓包工具 Fidller ,Chrome F12開發(fā)人員工具,注意偶然的發(fā)現(xiàn),微信的客戶端有一個min-webmm1cba21.js ,其中清晰可見的XSS filter規(guī)范。

Atas ialah kandungan terperinci 微信二維碼登錄中的JS代碼分析. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276
Salin Komik (Pintu Laman Web Rasmi) _COPY COMICS (NBA) Portal Membaca Tulen Salin Komik (Pintu Laman Web Rasmi) _COPY COMICS (NBA) Portal Membaca Tulen Jun 05, 2025 pm 04:12 PM

Komik menyalin tidak diragukan lagi sebagai harta yang tidak dapat dilepaskan. Di sini anda boleh menemui komik bola keranjang dalam pelbagai gaya, dari cerita kompetitif yang bersemangat dan inspirasi untuk komedi harian yang santai dan lucu. Sama ada anda ingin menghidupkan semula klasik atau menemui karya baru, menyalin komik dapat memenuhi keperluan anda. Melalui portal bacaan dalam talian yang disediakan oleh Copy Comics, anda akan mengucapkan selamat tinggal kepada masalah sumber cetak rompak, menikmati pengalaman membaca yang tinggi dan lancar, dan dapat menyokong pengarang komik kegemaran anda dan menyumbang kepada pembangunan komik yang sahih.

Mana yang lebih baik, penyemak imbas UC atau penyemak imbas QQ? Perbandingan dan penilaian mendalam mengenai penyemak imbas UC dan QQ Mana yang lebih baik, penyemak imbas UC atau penyemak imbas QQ? Perbandingan dan penilaian mendalam mengenai penyemak imbas UC dan QQ May 22, 2025 pm 08:33 PM

Memilih penyemak imbas UC atau penyemak imbas QQ bergantung kepada keperluan anda: 1. Pelayar UC sesuai untuk pengguna yang mengejar fungsi hiburan yang cepat dan kaya; 2. Pelayar QQ sesuai untuk pengguna yang memerlukan kestabilan dan sambungan lancar dengan produk Tencent.

Peringkat Perisian Penulisan AI Top 10 AI Disyorkan Perisian Penulisan AI adalah PERCUMA Peringkat Perisian Penulisan AI Top 10 AI Disyorkan Perisian Penulisan AI adalah PERCUMA Jun 04, 2025 pm 03:27 PM

Menggabungkan trend industri terkini dan data penilaian pelbagai dimensi pada tahun 2025, yang berikut adalah cadangan perisian penulisan AI yang komprehensif, yang meliputi senario arus perdana seperti penciptaan umum, penyelidikan akademik, dan pemasaran komersial, sambil mengambil kira perkhidmatan pengoptimuman dan penyetempatan Cina:

Tonton halaman rasmi NIS Comics dalam talian untuk komik percuma. Laman Web Kemasukan Percuma Laman Masuk NIS Comics Tonton halaman rasmi NIS Comics dalam talian untuk komik percuma. Laman Web Kemasukan Percuma Laman Masuk NIS Comics Jun 12, 2025 pm 08:18 PM

Komik yang bagus, platform pengalaman membaca yang mendalam yang didedikasikan untuk mencipta pencinta komik, menyatukan sejumlah besar sumber komik berkualiti tinggi di rumah dan di luar negara. Ia bukan sahaja platform membaca komik, tetapi juga komuniti yang menghubungkan artis komik dan pembaca dan berkongsi budaya komik. Melalui reka bentuk antara muka yang mudah dan intuitif dan fungsi carian yang kuat, NES Comics membolehkan anda dengan mudah mencari karya kegemaran anda dan menikmati pengalaman membaca yang lancar dan selesa. Katakan selamat tinggal kepada operasi yang lama menunggu dan membosankan, masukkan dunia komik yang bagus dengan serta -merta dan mulakan perjalanan komik anda!

Frog Man Online Melihat Lelaki Lelaki Masuk Lelaki (Masuk Web Page) Tonton Dalam Talian Frog Man Online Melihat Lelaki Lelaki Masuk Lelaki (Masuk Web Page) Tonton Dalam Talian Jun 12, 2025 pm 08:06 PM

Komik Frogman telah menjadi pilihan pertama bagi banyak pencinta komik dengan sumber komik yang kaya dan pelbagai dan pengalaman membaca dalam talian yang mudah dan lancar. Ia seperti kolam yang bersemangat, dengan cerita -cerita segar dan menarik yang sentiasa muncul, menunggu anda menemui dan meneroka. Frog Man Comics meliputi pelbagai subjek, dari pengembaraan yang ghairah hingga cinta manis, dari fantasi dan fiksyen sains untuk penangguhan yang menggembirakan, tidak kira genre yang anda suka, anda dapat mencari karya kegemaran anda di sini. Reka bentuk antara muka yang mudah dan intuitif membolehkan anda dengan mudah memulakan, dengan cepat mencari komik yang anda ingin baca, dan tenggelamkan diri anda dalam dunia komik yang menarik.

Baozi Comics (Masuk) _ Baozi Comics (pintu masuk baru) 2025 Baozi Comics (Masuk) _ Baozi Comics (pintu masuk baru) 2025 Jun 05, 2025 pm 04:18 PM

Di sini, anda boleh menikmati lautan komik yang luas dan meneroka karya-karya pelbagai tema dan gaya, dari komik lelaki muda yang ghairah hingga komik gadis yang halus dan bergerak, dari komik misteri yang membosankan dan membakar otak untuk komik harian yang santai dan lucu, ada segala-galanya, dan selalu ada yang dapat menyentuh hati anda. Kami bukan sahaja mempunyai sejumlah besar sumber komik yang tulen, tetapi juga sentiasa memperkenalkan dan mengemas kini kerja -kerja terkini untuk memastikan bahawa anda dapat membaca komik kegemaran anda secepat mungkin.

b Alamat Berdaftar Terkini untuk mendaftarkan B pertukaran b Alamat Berdaftar Terkini untuk mendaftarkan B pertukaran May 26, 2025 pm 07:12 PM

Laman web rasmi terbaru 2025b anhui adalah: https://www.marketwebb.co/zh-cn/join?ref=507720986&amp ;type=wenzi; Binance Exchange adalah pertukaran cryptocurrency global yang melayani 180 negara dan wilayah termasuk Amerika Utara, Eropah, Taiwan, Timur Tengah, Hong Kong, dan Malaysia. Ia menyediakan lebih daripada 600 kriptografi dan mempunyai 270 juta pengguna berdaftar di seluruh dunia.

Bagaimana untuk memuat turun Huobi pada telefon Android? Tutorial Muat Turun Huobi (tutorial langkah demi langkah) Bagaimana untuk memuat turun Huobi pada telefon Android? Tutorial Muat Turun Huobi (tutorial langkah demi langkah) Jun 12, 2025 pm 10:12 PM

Pengguna telefon bimbit Android boleh memuat turun dan memasang aplikasi Huobi/Huobi melalui langkah -langkah berikut: 1. Pastikan rangkaian stabil dan ruang penyimpanan mencukupi; 2. Muat turun aplikasi melalui laman web rasmi Huobi/Huobi, gunakan penyemak imbas untuk mengakses laman web rasmi dan klik pautan muat turun atau mengimbas kod QR, atau cari dan muat turun melalui kedai aplikasi pihak ketiga seperti Apptreasure dan Huawei App Market, dan anda juga boleh mendapatkan pakej pemasangan melalui perkongsian rakan-rakan; 3. Cari fail .apk yang dimuat turun, aktifkan kebenaran pemasangan "Sumber Sumber Tidak Diketahui", ikuti arahan untuk menyelesaikan pemasangan, dan lain -lain.

See all articles