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


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 相关文章推荐
JavaScript版代码高亮
Jun 26 Javascript
JavaScript Konami Code 实现代码
Jul 29 Javascript
JS window.opener返回父页面的应用
Oct 24 Javascript
javascript判断用户浏览器插件安装情况的代码
Jan 01 Javascript
jquery下checked取值问题的解决方法
Aug 09 Javascript
自己写的Javascript计算时间差函数
Oct 28 Javascript
关于json字符串与实体之间的严格验证代码
Nov 10 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
Apr 22 Javascript
使用JavaScript实现表格编辑器(实例讲解)
Aug 02 Javascript
js判断数组是否包含某个字符串变量的实例
Nov 24 Javascript
Vue.js如何使用Socket.IO的示例代码
Sep 05 Javascript
JavaScript实现烟花绽放动画效果
Aug 04 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 检查扩展库或函数是否可用的代码
2010/04/06 PHP
php实现求相对时间函数
2015/06/15 PHP
PHP框架性能测试报告
2016/05/08 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
js常用代码段整理
2011/11/30 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
2012/12/13 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
Vue.use源码分析
2017/04/22 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
python实现画圆功能
2018/01/25 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
Python制作动态字符图的实例
2019/01/27 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
Python3远程监控程序的实现方法
2019/07/15 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
详解python metaclass(元类)
2020/08/13 Python
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
女性时尚在线:IVRose
2019/02/23 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
党性教育心得体会
2014/09/03 职场文书
Python中的datetime包与time包包和模块详情
2022/02/28 Python
处理canvas绘制图片模糊问题
2022/05/11 Javascript