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


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 相关文章推荐
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
Apr 21 Javascript
javascript实现可改变滚动方向的无缝滚动实例
Jun 17 Javascript
DOM基础教程之使用DOM
Jan 19 Javascript
javascript中Array数组的迭代方法实例分析
Feb 04 Javascript
JQuery入门基础小实例(1)
Sep 17 Javascript
你有必要知道的25个JavaScript面试题
Dec 29 Javascript
jQuery1.9+中删除了live以后的替代方法
Jun 17 Javascript
整理一些最近经常遇到的前端面试题
Apr 25 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
May 04 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
Dec 20 Javascript
node中IO以及定时器优先级详解
May 10 Javascript
vue实现输入一位数字转汉字功能
Dec 13 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
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
2019/04/16 jQuery
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
Python中多线程thread与threading的实现方法
2014/08/18 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
python 日志增量抓取实现方法
2018/04/28 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
树莓派实现移动拍照
2019/06/22 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
建筑工地质量标语
2014/06/12 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
北京故宫的导游词
2015/01/31 职场文书
法学专业求职信范文
2015/03/19 职场文书
初中班干部工作总结
2015/08/10 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
vue实现简易音乐播放器
2022/08/14 Vue.js