JavaScript

超轻量级php框架startmvc

浅析微信扫码登录原理(小结)

更新时间:2020-08-02 20:54:01 作者:startmvc
微信扫码登录原理解析扫码登录是现在流行的登录方式,使用这种方式及其方便,而且安全

微信扫码登录原理解析

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

扫码登录流程

原理

获取唯一的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的形式,排除了跨域问题
  • 轮询采用的后台根据扫码情况阻塞前台请求,优化轮询及减少前端的无效轮询

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

微信扫码登录 微信登录原理