之前在极客时间看到一个介绍二维码登录的原理,这里写篇文章记录一下。二维码是我们日常生活中随处可见,支付扫码,登录扫码,添加好友扫码,或者查看某些内容也需要扫码。今天分享一下二维码背后的技术和逻辑,并且通过二维码登录的例子,了解二维码在某些场景中的使用方法。

二维码的主要作用

二维码用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形。他的主要作用在于记录数据。二维码可以保存各种类型的数据,例如文本,网站,文件,图片等。你可以在浏览器中搜索二维码,就可以发现很多生成二维码的工具(例如草料二维码),你可以通过工具将各种数据转换成二维码,或者将某个二维码转换成对应的数据。我们通过将我们的数据保存到二维码中,然后再使用不同的方式解码,就可以达到我们想要的功能。

登录原理

二维码登录是二维码登录常用的场景之一,通过扫描PC或者web端的二维码,来登录同一个系统。例如手机微信扫码登录PC端微信,手机淘宝扫码登录web端淘宝,还有其他各种视频网页或者PC端,都可以通过扫码来登录。

手机端扫码PC端二维码,扫码确认后,手机端账号就在PC端登录了,这里,手机端和PC端登录的肯定是同一个账号。二维码登录本质也是一种登录认证方式,要做的只有两件事:①告诉系统我是谁。②向系统证明我是谁。比如账号密码登录,账号告诉系统我是谁,密码向系统证明我是谁,验证码登录也同理。那么二维码登录是怎么做到这两件事的?

1、告诉系统我是谁

通过手机扫码,将数据传递给PC端。

2、向系统证明我是谁

因为手机端已经登录,因此只要证明扫码登录的是这个手机,而且是这个账号操作的,就证明了我是谁。

token的认证机制

由于手机端是不会保存用户密码的,手机端保存用户登录的背后是一套基于token的认证机制。

①在账号密码登录时,客户端会将他的设备信息(例如设备id,设备类型<ios,android,pc等>)同时传递给服务端。

②如果密码校验通过,服务端会将账号和设备绑定,存在一个数据结构中(token)。token其实就是一串包含了部分信息的字符串。

③客户端获取到这个token后,将这个token保存到本地。

④每次访问的时候,将这个token和设备信息(指的不是token中的设备信息)传递给服务器。

⑤服务端通过token找到与它绑定的设备信息,用找到的设备信息与PC端传过来的设备信息进行比较。

⑥如果相同则返回API响应信息,不同就拒绝访问。客户端登录的目的就是为了获取自己对应的token具体的流程图如下:

二维码登录具体步骤

一般来说,二维码登录有以下几个步骤:①PC端展示二维码。②手机端扫描二维码。③PC端已扫描,请确认。④手机端确认。⑤登录成功。流程如下图:

在整个过程中,二维码有三个状态:待扫描已扫描待确认已确认。可以想象,二维码的背后一定存在一个唯一性ID,当二维码生成时,唯一ID也一起生成,并绑定PC端的设备信息。手机扫描二维码时,就会将账号信息与唯一ID绑定。当手机确认登录时,他就会生成PC端用于登录的token,并返回给PC端。具体流程如下:

在了解大致流程以后,我们来具体讲解,获取二维码,二维码扫码,二维码确认中间的具体流程。

①PC端像服务端发送二维码请求,并携带设备信息。

②服务端在收到请求后,生成二维码ID,并将二维码ID绑定设备信息。之后,返回二维码ID给PC端。

③PC端获取到二维码ID后,生成对应的二维码,二维码中含有二维码ID的信息(可能是二维码ID或者是包含二维码ID的URL)。

④PC端在展现二维码以后,不断的轮询服务端,查询二维码状态。

二维码准备好后,就是扫描状态。

①用户用手机扫描PC端二维码,通过二维码获取到其中的二维码ID。

②然后调用服务端API,将手机端的身份信息和二维码ID一起发给服务端。

③服务端接收到以后,将身份信息和二维码ID进行一个绑定,并生成一个临时token(临时token和token都是一种身份凭证,不同在于临时token用一次就失效了,这里返回临时token给手机端,为了手机端在下一次操作时可以以临时token作为凭证,保证扫码和登录两步操作是同一个设备)返回给手机端。

④这时候二维码状态变成了已扫描,因为PC端一直在轮询二维码状态,所以当得知二维码状态发生改变时,它就可以在界面上把二维码的状态改成已扫描。

接下来是最后的确认:

①手机端在收到临时token时,会弹出确认登录界面。

②在确认登录时,手机端会携带临时token用来调用服务端的接口,告诉服务端已经确认。

③服务端收到确认后,根据二维码ID绑定的设备信息和账号信息生成PC端的token。

④这时候PC端的轮询接口得知二维码的状态变成已确认,并且从服务端获取到用于登录的token。

到这里,登录就成功了,PC端将获取到的token保存到本地,每次请求时将token带上,就能顺利的访问服务端的资源了。


参考:二维码扫描登录是什么原理?

形象理解二维码登录原理相关推荐

  1. 二维码登录原理及生成与解析

    一.前言 这几天在研究二维码的扫码登录.初来乍到,还有好多东西不懂.在网上看到有人写了一些通过QRCode或者Zxing实现二维码的生成和解码.一时兴起,决定自己亲手试一试.本人是通过QRCode实现 ...

  2. 微信QQ的二维码登录原理js代码解析

    这篇文章主要大家详细解析了微信QQ的二维码登录原理js代码, 具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在很多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈 ...

  3. 图示扫描二维码登录原理

    想要了解手机端扫描二维码登录原理,首先我们要了解二维码和token认证机制两个内容,接下来我们将用图示的方法来直观感受这个面试时候的paper tiger. (第一次用visio画图,用熟练之后就感觉 ...

  4. 二维码登录原理+Web端即时通讯技术

    前言 上周在写项目过程中遇到需要实现二维码的登录功能,将这个过程细节记录下来 二维码的登录过程,主要难点在于用户扫码了浏览器展示的二维码,但是浏览器本身是无法知道的,需要服务端告知信息. 涉及到 we ...

  5. 微信QQ的二维码登录原理浅析

    在非常多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈骗就不说了),二维码验证,多终端辅助授权应用開始多起来,这里先说下啥是二维码,事实上二维码就是存了二进制数据的 ...

  6. QQ网页微信、QQ二维码登录原理分析(整理)

    QQ和微信的登录过程中,使用二维码登录,这里根据网上的一些资料简单总结: 二维码是包含二进制数据的黑白图片.当进行登录时,服务器生成一条二维码信息,发送给PC客户端.这时,手机终端(已经存在指定账号登 ...

  7. 二维码登录——原理区

    2019独角兽企业重金招聘Python工程师标准>>> 1.PC端的逻辑 用户点击二维码按钮,向后台发送创建二维码的ajax异步请求,后台生成二维码后以二进制数据流的形式返回给前台, ...

  8. java二维码登录实现

    二维码登录原理 让服务端知道是那个用户要登录,验证通过后 服务端通过webscoket 告知 前端 登录成功即可 前端二维码登录实现 链接: 仿知乎pc登录注册二维码登录页面. 下载下来修改一下即可使 ...

  9. 浅谈扫描二维码登录微信网页版与摇一摇传图的实现原理

    前言:简单体验了下微信网页版通过二维码登录和摇一摇传图功能,从技术角度看,网上专家吹捧的 [隔空取物]其实并不神秘,我先简单分析一下. 1. 微信移动端扫描二维码登录(C-S-C模式) CSC模式为: ...

最新文章

  1. 舒工自定义AJAX-lite 1.0实用型极简方法
  2. 每天一个python 小案例——if else
  3. 基于MATLAB的RGB转YCBCR色彩空间转换
  4. CompletableFuture详解~cancel
  5. 吊打面试官 | Java到底是值传递还是引用传递
  6. pip3 安装pycrypto 时报错
  7. StringHelper--封转自己的字符串工具类
  8. 博客园项目开发中的难点
  9. 蓝桥杯 ADV-79 算法提高 时间转换
  10. MapGuide应用程序演示样例——你好,MapGuide!
  11. Foreign Language_english_补语
  12. 混沌图像---陈氏吸引子的飞蛾
  13. Excel多条件求和函数之SUMPRODUCT
  14. Java基础--继承
  15. 使用poi做excel导出时解决以文本格式存储的数字问题
  16. 批量进行数字变下标的处理
  17. 基于小波分解与LSTM的城市轨道短时客流预测
  18. ffmpeg批量m4a转mp3
  19. 拼多多校招算法题迷宫寻路
  20. 猜想2010年IT十大表情

热门文章

  1. 传智播客java博科学院怎么走_想去传智播客学习大家可不可以给的建议?
  2. Linux友好度太低?试试Clion远程开发|ssh连接远程主机
  3. DMA基本原理+实验
  4. 数据开发-SQL语句优化及实用SQL案例
  5. 《阿里云服务器搭建》------ 安装Jenkins
  6. webpack面试题整理
  7. React Native自定义导航栏
  8. python控制运算的优先顺序符号_Python基础语法-内存管理-运算符-程序控制
  9. SpringBoot单实例与线程安全总结
  10. lammps输出RDF(径向分布函数)详解及示例教程