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


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 相关文章推荐
收藏一些不常用,但是有用的代码
Mar 12 Javascript
用JavaScript 处理 URL 的两个函数代码
Aug 13 Javascript
ExtJS Grid使用SimpleStore、多选框的方法
Nov 20 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
Nov 17 Javascript
详解AngularJS实现表单验证
Dec 10 Javascript
js添加事件的通用方法推荐
May 15 Javascript
AngularJS中过滤器的使用与自定义实例代码
Sep 17 Javascript
微信小程序中显示html格式内容的方法
Apr 25 Javascript
React Native 搭建开发环境的方法步骤
Oct 30 Javascript
Vue项目history模式下微信分享爬坑总结
Mar 29 Javascript
JS实现网页时钟特效
Mar 25 Javascript
JavaScript parseInt0.0000005打印5原理解析
Jul 23 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+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
js中unicode转码方法详解
2015/10/09 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
bootstrap网格系统使用方法解析
2017/01/13 Javascript
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
python中实现k-means聚类算法详解
2017/11/11 Python
Django原生sql也能使用Paginator分页的示例代码
2017/11/15 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
python批量识别图片指定区域文字内容
2019/04/30 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
2019/08/02 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
巧克力蛋糕店创业计划书
2014/01/14 职场文书
教师产假请假条
2014/04/10 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
婚宴领导致辞
2015/07/28 职场文书
班委竞选稿范文
2015/11/21 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
pytorch中的 .view()函数的用法介绍
2022/03/17 Python