国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 12:37:15
字體:
來源:轉載
供稿:網友

微信掃碼登錄原理解析

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

掃碼登錄流程

原理

獲取唯一的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 }

瀏覽器輪詢服務器,獲取掃碼狀態

// 查看掃碼狀態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}

根據服務器返回的掃碼狀態,進行相應的操作

408 掃碼超時 如果手機沒有掃碼或沒有授權登錄,服務器會阻塞約25s,然后返回狀態碼 408 -> 前端繼續輪詢


400 二維碼失效 大約5分鐘的時間內不掃碼,二維碼失效

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

200 已授權 如果手機點擊了確認登錄,服務器返回200及token -> 前端停止輪詢, 獲取到token,重定向到目標頁

// 根據服務器返回的掃碼狀態,進行相應的操作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 票據丟失",    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)}

總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永清县| 桐梓县| 门源| 黄骅市| 七台河市| 永福县| 台山市| 桐城市| 犍为县| 镇巴县| 顺昌县| 汝城县| 伊春市| 乡城县| 寻乌县| 珠海市| 丹凤县| 巴楚县| 绥德县| 商城县| 灯塔市| 博客| 淮南市| 大渡口区| 芮城县| 利川市| 浮山县| 江安县| 灵川县| 广灵县| 平度市| 聂拉木县| 南平市| 独山县| 平江县| 赣州市| 资阳市| 七台河市| 化州市| 芮城县| 利津县|