二维码扫描登录原理

扫二维码登录现在比较常见,比如微信、支付宝等 PC 端登录,并且好像每款 APP 都支持扫码登录,不搞个扫码登录都不好意思。作为技术人员,不知道您对这背后的实现逻辑是否敢兴趣,反正我是一直都对这背后实现好奇。最近刚好看到一个关于扫码登录原理的视频,于是就整理出来了这篇文章,希望对您有所帮助。

本文共三个主题:

  • 什么是二维码。
  • 移动端基于 token 的认证机制。
  • 二维码扫码登录的原理。

1、什么是二维码

二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。----来自百度百科

在商品上,一般都会有条形码,条形码也称为一维码,条形码只能表示一串数字。二维码要比条形码丰富很多,可以存储数字、字符串、图片、文件等,比如我们可以把 www.baidu.com 存储在二维码中,扫码二维码我们就可以获取到百度的地址。

可能用文字说起来还是比较难理解,您可以百度:草料二维码,一款二维码生成和解析工具,玩一玩你就知道二维码是个啥了。

2、移动端基于 token 的认证机制

在了解扫码登录原理之前,有必要先了解移动端基于 token 的认证机制,对理解扫码登录原理还是非常有帮助的。基于 token 的认证机制跟我们常用的账号密码认证方式有较大的不同,安全系数比账号密码要高,如果每次验证都传入账号密码,那么被劫持的概率就变大了。

基于 token 的认证机制流程图,如下图所示:

基于 token 的认证机制,只有在第一次使用需要输入账号密码,后续使用将不在输入账号密码。其实在登陆的时候不仅传入账号、密码,还传入了手机的设备信息。在服务端验证账号、密码正确后,服务端会做两件事

第一,将账号与设备关联起来,在某种意义上,设备信息就代表着账号。

第二,生成一个 token 令牌,并且在 token 与账号、设备关联,类似于key/value,token 作为 key ,账号、设备信息作为value,持久化在磁盘上。

将 token 返回给移动端,移动端将 token 存入在本地,往后移动端都通过 token 访问服务端 API ,当然除了 token 之外,还需要携带设备信息,因为 token 可能会被劫持。带上设备信息之后,就算 token 被劫持也没有关系,因为设备信息是唯一的。

这就是基于 token 的认证机制,将账号密码换成了 token、设备信息,从而提高了安全系数,可别小看这个 token ,token 是身份凭证,在扫码登录的时候也会用到。

3、二维码扫码登录的原理

好了,知道了移动端基于 token 的认证机制后,接下来就进入我们的主题:二维码扫码登陆的原理。先上二维码扫码登录的流程图:

扫码登录可以分为三个阶段:待扫描、已扫描待确认、已确认。我们就一一来看看这三个阶段。

1、待扫描阶段

待扫描阶段也就是流程图中 1~5 阶段,即生成二维码阶段,这个阶段跟移动端没有关系,是 PC 端跟服务端的交互过程。

首先 PC 端携带设备信息想服务端发起生成二维码请求,服务端会生成唯一的二维码 ID,你可以理解为 UUID,并且将 二维码 ID 跟 PC 设备信息关联起来,这跟移动端登录有点相似。

解码查看二维码信息(带有参数uuid=0116AnEH1IZS000a):二维码解码

https://open.weixin.qq.com/connect/confirm?uuid=0116AnEH1IZS000a

PC 端接受到二维码 ID 之后,将二维码 ID 以二维码的形式展示,等待移动端扫码。此时在 PC 端会启动一个定时器,轮询查询二维码的状态。如果移动端未扫描的话,那么一段时间后二维码将会失效。

2、已扫描待确认阶段

流程图中第 6 ~ 10 阶段,我们在 PC 端登录微信时,手机扫码后,PC 端的二维码会变成已扫码,请在手机端确认。这个阶段是移动端跟服务端交互的过程。

 首先移动端扫描二维码,获取二维码 ID,然后将手机端登录的信息凭证(token)和 二维码 ID 作为参数发送给服务端,此时的手机一定是登录的,不存在没登录的情况。

服务端接受请求后,会将 token 与二维码 ID 关联,为什么需要关联呢?你想想,我们使用微信时,移动端退出, PC 端是不是也需要退出,这个关联就有点把子作用了。然后会生成一个一次性 token,这个 token 会返回给移动端,一次性 token 用作确认时候的凭证

PC 端的定时器,会轮询到二维码的状态已经发生变化,会将 PC 端的二维码更新为已扫描,请确认。目测是以下接口拿UUID在检测二维码状态。

3、已确认

流程图中的 第 11 ~ 15 步骤,这是扫码登录的最后阶段,移动端携带上一步骤中获取的临时 token ,确认登录,服务端校对完成后,会更新二维码状态,并且给 PC 端生成一个正式的 token ,后续 PC 端就是持有PC 端的定时器,轮询到了二维码状态为登录状态,并且会获取到了生成的 token ,完成登录,后续访问都基于 token 完成。

点拒绝

 点允许

在服务器端会跟手机端一样,维护着 token 跟二维码、PC 设备信息、账号等信息。

如何确认点击允许提交了二维码ID和移动端登录token(登录凭证),从而使第三方网站和具体微信用户挂上钩呢?以下是网友爬取的点击“允许”的接口数据,可见里面有二维码的UUID,但具体哪个参数才是和移动端的登录凭证相关的就不得而知了,毕竟这不是一个公开的接口。

https://open.weixin.qq.com/connect/confirm_reply

pass_ticket=v1xnAuk0fQLjHQj78uwv8QrEOoYZXvXadRYxz31%2BIkP%2F7IXEKuRE%2BLGIzuu5kwWH&key=f8d22b116d47b51e62b7220d6cab7cb5b2eefb9d7b58bace8ede258ab6dd23df49db3d66985ce58ab4e80b644fdd43c77d5ef887e9b38ea01430f6f833c65a58bf740dba719a0ba8e4eb36dc5141e480&uin=MjQzNzEzNzk2MA%3D%3D&uuid=0318gIJLqTcqXhO8&snsapi_login=on&allow=allow

到此,二维码扫描登录原理就差不多了,二维码扫描登录在原理上不难理解,但是实现起来可能就比较复杂。

微信扫码登录底层是基于OAuth2.0协议,原理跟上文讲的差不多,参考:网站应用微信登录开发指南

大概流程:

  1. 第三方网站,也就是「一号会员店」从微信获取一个UUID,和登录的二维码绑定,
  2. 用户扫码二维码点确认后,向微信提交该UUID和移动端的登录凭证,微信拿到这两个参数后就可以实现 「一号会员店」和具体微信用户的绑定,绑定后生成一个临时票据CODE给到「一号会员店」,「一号会员店」拿这个CODE去获取访问TOKEN,然后拿访问TOKEN去获取具体的微信用户信息。

至于为啥中间需要临时票据CODE,而不是直接返回TOKEN,这是AUTh2.0的规定,

具体原因是为了保证安全:

code 是通过浏览器重定向获取的,你在浏览器地址栏就可以看到,如果这一步不返回code而是直接返回 token,那么这个token其实已经暴露了。

而client拿到code以后换取token是client后台对认证服务器的访问,不依赖浏览器,token不会暴露出去(因为获取code只需要appid,而获取token需要appid和secret,appid和secret是第三方应用在微信注册用来标识其身份的(重要数据,不随便暴露给浏览器),所以即使暴露了code,因为浏览器拿不到secret也还是拿不到用户信息

相关文章:

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

微信第三方扫码登录抓包小记

带大家写一波微信公众号的爬取!谁说微信爬不了的!

如何实现微信扫码登录--OAuth2

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值