淺析微信掃碼登錄原理(小結(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),進(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)文章
javascript實(shí)現(xiàn)圣旨卷軸展開效果(代碼分享)
本文主要介紹了javascript實(shí)現(xiàn)圣旨卷軸展開效果的示例代碼。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03swiper 自動圖片無限輪播實(shí)現(xiàn)代碼
今天移動端正好需要圖片觸摸滑動效果實(shí)現(xiàn)代碼,基于swiper實(shí)現(xiàn),需要的朋友可以參考下2018-05-05微信小程序動畫組件使用解析,類似vue,且更強(qiáng)大
這篇文章主要介紹了微信小程序動畫組件,類似vue,且更強(qiáng)大使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Bootstrap中的表單驗(yàn)證插件bootstrapValidator使用方法整理(推薦)
這篇文章主要介紹了Bootstrap中的表單驗(yàn)證插件bootstrapValidator使用方法整理(推薦)的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06基于postman獲取動態(tài)數(shù)據(jù)過程詳解
這篇文章主要介紹了基于postman獲取動態(tài)數(shù)據(jù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09javascript的document中的動態(tài)添加標(biāo)簽實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄獪\談javascript的document中的動態(tài)添加標(biāo)簽實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10深入理解JavaScript Promise鏈?zhǔn)秸{(diào)用與錯誤處理機(jī)制
在JavaScript的異步編程中,Promise是一個非常重要的概念,它允許我們以鏈?zhǔn)降姆绞教幚懋惒讲僮?使得代碼更加清晰和易于管理,本文將通過一系列代碼示例,深入探討Promise的鏈?zhǔn)秸{(diào)用和錯誤處理機(jī)制,需要的朋友可以參考下2024-09-09