淺析微信掃碼登錄原理(小結(jié))
微信掃碼登錄原理解析
掃碼登錄是現(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),進行相應(yīng)的操作
408 掃碼超時 如果手機沒有掃碼或沒有授權(quán)登錄,服務(wù)器會阻塞約25s,然后返回狀態(tài)碼 408 -> 前端繼續(xù)輪詢
400 二維碼失效 大約5分鐘的時間內(nèi)不掃碼,二維碼失效
201 已掃碼 如果手機已經(jīng)掃碼,服務(wù)器立即返回狀態(tài)碼和用戶的基本信息 (window.code=201,window.code.userAvator="..."),-> 前端繼續(xù)輪詢
200 已授權(quán) 如果手機點擊了確認登錄,服務(wù)器返回200及token -> 前端停止輪詢, 獲取到token,重定向到目標頁
// 根據(jù)服務(wù)器返回的掃碼狀態(tài),進行相應(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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript實現(xiàn)圣旨卷軸展開效果(代碼分享)
本文主要介紹了javascript實現(xiàn)圣旨卷軸展開效果的示例代碼。具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03Bootstrap中的表單驗證插件bootstrapValidator使用方法整理(推薦)
這篇文章主要介紹了Bootstrap中的表單驗證插件bootstrapValidator使用方法整理(推薦)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06基于postman獲取動態(tài)數(shù)據(jù)過程詳解
這篇文章主要介紹了基于postman獲取動態(tài)數(shù)據(jù)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09javascript的document中的動態(tài)添加標簽實現(xiàn)方法
下面小編就為大家?guī)硪黄獪\談javascript的document中的動態(tài)添加標簽實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10深入理解JavaScript Promise鏈式調(diào)用與錯誤處理機制
在JavaScript的異步編程中,Promise是一個非常重要的概念,它允許我們以鏈式的方式處理異步操作,使得代碼更加清晰和易于管理,本文將通過一系列代碼示例,深入探討Promise的鏈式調(diào)用和錯誤處理機制,需要的朋友可以參考下2024-09-09