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


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 相关文章推荐
window.location和document.location的区别分析
Dec 23 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
Feb 07 Javascript
扒一扒JavaScript 预解释
Jan 28 Javascript
jQuery实现垂直半透明手风琴特效代码分享
Aug 21 Javascript
javascript简单实现等比例缩小图片的方法
Jul 27 Javascript
jQuery Ajax前后端使用JSON进行交互示例
Mar 17 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
Aug 24 Javascript
详解Angular6学习笔记之主从组件
Sep 05 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
Nov 22 Javascript
解决layer 动态加载select 失效的问题
Sep 18 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
Dec 11 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
Aug 25 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
Get或Post提交值的非法数据处理
2006/10/09 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
python线程池threadpool使用篇
2018/04/27 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
使用python获取电脑的磁盘信息方法
2018/11/01 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
化学教师教学反思
2014/01/17 职场文书
物理力学求职信
2014/02/18 职场文书
法律专业求职信
2014/05/24 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
2014年稽查工作总结
2014/12/20 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
HTML基础详解(上)
2021/10/16 HTML / CSS