微信小程序开发前_浅析微信扫码登录原理(小结)

浅析微信扫码登录原理(小结)       这篇文章主要介绍了浅析微信扫码登录原理(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

微信扫码登录原理解析

扫码登录是现在流行的登录方式,使用这种方式及其方便,而且安全

扫码登录流程

原理

获取唯一的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 ),
 e.code = c.code,
 e.userAvatar = c.userAvatar,
 a.log("get code", c.code)
}

总结

轮询采用的是JSONP的形式,排除了跨域问题 轮询采用的后台根据扫码情况阻塞前台请求,优化轮询及减少前端的无效轮询

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持凡科。


相关阅读