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


Posted in Javascript onOctober 29, 2018

微信扫码登录原理解析

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

扫码登录流程

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

原理

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

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

Javascript 相关文章推荐
js 内存释放问题
Apr 25 Javascript
JS对select控件option选项的增删改查示例代码
Oct 21 Javascript
JS去掉第一个字符和最后一个字符的实现代码
Feb 20 Javascript
基于socket.io和node.js搭建即时通信系统
Jul 30 Javascript
js表单验证实例讲解
Mar 31 Javascript
easyui validatebox验证
Apr 29 Javascript
AngularJS入门之动画
Jul 27 Javascript
js+css3制作时钟特效
Oct 16 Javascript
深入浅析Node.js单线程模型
Jul 10 Javascript
Vue.js项目模板搭建图文教程
Sep 20 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
Dec 06 Javascript
JavaScript 实现同时选取多个时间段的方法
Oct 17 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
Oct 29 #Javascript
详解vue-router数据加载与缓存使用总结
Oct 29 #Javascript
vue mounted 调用两次的完美解决办法
Oct 29 #Javascript
Electron中实现大文件上传和断点续传功能
Oct 28 #Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
Oct 28 #Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
Oct 28 #Javascript
深入浅析javascript函数中with
Oct 28 #Javascript
You might like
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
图像替换新技术 状态域方法
2010/01/28 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
javascript:window.open弹出窗口的位置问题
2014/03/18 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
2018/09/21 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
Python的Django框架使用入门指引
2015/04/15 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
python实现简单俄罗斯方块
2020/03/13 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
怎么写好自荐信
2013/10/30 职场文书
社区端午节活动方案
2014/01/28 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
员工升职自荐信
2015/03/27 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书