欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析微信掃碼登錄原理(小結(jié))

 更新時間:2018年10月29日 09:40:40   作者:Yangfan2016  
這篇文章主要介紹了淺析微信掃碼登錄原理(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

微信掃碼登錄原理解析

掃碼登錄是現(xiàn)在流行的登錄方式,使用這種方式及其方便,而且安全

掃碼登錄流程

原理

獲取唯一的uuid, 以及包含uid信息的二維碼

// 獲取uuid
 getUUID: function() {
  var e = t.defer();
  return window.QRLogin = {},
  $.ajax({
   url: i.API_jsLogin,
   dataType: "script"
  }).done(function() {
   200 == window.QRLogin.code ? e.resolve(window.QRLogin.uuid) : e.reject(window.QRLogin.code)
  }).fail(function() {
   e.reject()
  }),
  e.promise
 }

瀏覽器輪詢服務(wù)器,獲取掃碼狀態(tài)

// 查看掃碼狀態(tài)
checkLogin: function(e, a) {
 var n = t.defer()
  , a = a || 0;
 return window.code = 0,
 window.checkLoginPromise = $.ajax({
  url: i.API_login + "?loginicon=true&uuid=" + e + "&tip=" + a + "&r=" + ~new Date,
  dataType: "script",
  timeout: 35e3
 }).done(function() {
  new RegExp("/" + location.host + "/");
  if (window.redirect_uri && window.redirect_uri.indexOf("/" + location.host + "/") < 0)
   return void (location.href = window.redirect_uri);
  var e = {
   code: window.code,
   redirect_uri: window.redirect_uri,
   userAvatar: window.userAvatar
  };
  n.resolve(e)
 }).fail(function() {
  n.reject()
 }),
 n.promise
}

根據(jù)服務(wù)器返回的掃碼狀態(tài),進(jìn)行相應(yīng)的操作

408 掃碼超時 如果手機(jī)沒有掃碼或沒有授權(quán)登錄,服務(wù)器會阻塞約25s,然后返回狀態(tài)碼 408 -> 前端繼續(xù)輪詢


400 二維碼失效 大約5分鐘的時間內(nèi)不掃碼,二維碼失效

201 已掃碼 如果手機(jī)已經(jīng)掃碼,服務(wù)器立即返回狀態(tài)碼和用戶的基本信息 (window.code=201,window.code.userAvator="..."),-> 前端繼續(xù)輪詢

200 已授權(quán) 如果手機(jī)點(diǎn)擊了確認(rèn)登錄,服務(wù)器返回200及token -> 前端停止輪詢, 獲取到token,重定向到目標(biāo)頁

// 根據(jù)服務(wù)器返回的掃碼狀態(tài),進(jìn)行相應(yīng)的操作
function o(c) {
 switch (c.code) {
 case 200:
  t.newLoginPage(c.redirect_uri).then(function(t) {
   var o = t.match(/<ret>(.*)<\/ret>/)
    , r = t.match(/<script>(.*)<\/script>/)
    , c = t.match(/<skey>(.*)<\/skey>/)
    , s = t.match(/<wxsid>(.*)<\/wxsid>/)
    , l = t.match(/<wxuin>(.*)<\/wxuin>/)
    , d = t.match(/<pass_ticket>(.*)<\/pass_ticket>/)
    , f = t.match(/<message>(.*)<\/message>/)
    , u = t.match(/<redirecturl>(.*)<\/redirecturl>/);
   return u ? void (window.location.href = u[1]) : o && "0" != o[1] ? (alert(f && f[1] || "登陸失敗"),
   i.report(i.AUTH_FAIL_COUNT, 1),
   void location.reload()) : (e.$emit("newLoginPage", {
    Ret: o && o[1],
    SKey: c && c[1],
    Sid: s && s[1],
    Uin: l && l[1],
    Passticket: d && d[1],
    Code: r
   }),
   void (a.getCookie("webwx_data_ticket") || n.report(n.ReportType.cookieError, {
    text: "webwx_data_ticket 票據(jù)丟失",
    cookie: document.cookie
   })))
  });
  break;
 case 201:
  e.isScan = !0,
  n.report(n.ReportType.timing, {
   timing: {
    scan: Date.now()
   }
  }),
  t.checkLogin(e.uuid).then(o, function(t) {
   !t && window.checkLoginPromise && (e.isBrokenNetwork = !0)
  });
  break;
 case 408:
  t.checkLogin(e.uuid).then(o, function(t) {
   !t && window.checkLoginPromise && (e.isBrokenNetwork = !0)
  });
  break;
 case 400:
 case 500:
 case 0:
  var s = a.getCookie("refreshTimes") || 0;
  s < 5 ? (s++,
  a.setCookie("refreshTimes", s, .5),
  document.location.reload()) : e.isNeedRefresh = !0;
  break;
 case 202:
  e.isScan = !1,
  e.isAssociationLogin = !1,
  a.setCookie("login_frequency", 0, 2),
  window.checkLoginPromise && (window.checkLoginPromise.abort(),
  window.checkLoginPromise = null ),
  r()
 }
 e.code = c.code,
 e.userAvatar = c.userAvatar,
 a.log("get code", c.code)
}

總結(jié)

  • 輪詢采用的是JSONP的形式,排除了跨域問題
  • 輪詢采用的后臺根據(jù)掃碼情況阻塞前臺請求,優(yōu)化輪詢及減少前端的無效輪詢

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論