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


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 相关文章推荐
IE浏览器打印的页眉页脚设置解决方法
Dec 08 Javascript
JavaScript Scoping and Hoisting 翻译
Jul 03 Javascript
jQuery :first选择器使用介绍
Aug 09 Javascript
js函数在frame中的相互调用详解
Mar 03 Javascript
jQuery select表单提交省市区城市三级联动核心代码
Jun 09 Javascript
js实现带圆角的多级下拉菜单效果
Aug 28 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
JS实现Select的option上下移动的方法
Mar 01 Javascript
原生JS查找元素的方法(推荐)
Nov 22 Javascript
关于Vue单页面骨架屏实践记录
Dec 13 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
Sep 11 Javascript
Vue中computed和watch有哪些区别
Dec 19 Vue.js
详解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中GET变量的使用
2006/10/09 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
Laravel 5框架学习之环境与配置
2015/04/08 PHP
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
javascript常用对话框小集
2013/09/13 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
vue router demo详解
2017/10/13 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
Python设置在shell脚本中自动补全功能的方法
2018/06/25 Python
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
Python实现EM算法实例代码
2020/10/04 Python
Hammitt官网:设计师手袋
2020/05/23 全球购物
编写strcpy函数
2014/06/24 面试题
干部行政关系介绍信
2014/01/17 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
化妆品促销方案
2014/02/24 职场文书
李敖北大演讲稿
2014/05/24 职场文书
员工薪酬激励方案
2014/06/13 职场文书
一般党员对照检查材料
2014/09/24 职场文书
感恩主题班会教案
2015/08/12 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书