关于im:IM扫码登录技术专题三通俗易懂IM扫码登录功能详细原理一篇就够

3次阅读

共计 6447 个字符,预计需要花费 17 分钟才能阅读完成。

本文援用了作者“大古同学”的“二维码扫码登录是什么原理”一文的次要内容,为了更好的了解和浏览,即时通讯网收录时有订正和改变,感激原作者的分享。

1、引言

自从微信的 PC 端应用扫码登陆认证逻辑后,这种形式仿佛在越来越多的 IM 中看到(尽管我集体认为这种登录形式很酷,但并不不便,尤其手机不大身边的时候)。


▲ 上图微信 PC 端的扫码登录界面
最近刚好看到一个二维码的技术原理解说视频,正好借此机会将扫码登录的具体技术原理梳理并总结一下,不便自已回顾,也心愿能帮忙到想在 IM 里开发相似性能的同行们。

补充阐明:本文所波及的扫码登陆原理并不是仅仅针对 IM 零碎,同样实用于 IM 之外的其它零碎。

学习交换:

  • 即时通讯 / 推送技术开发交换 5 群:215477170 [举荐]
  • 挪动端 IM 开发入门文章:《新手入门一篇就够:从零开发挪动端 IM》
  • 开源 IM 框架源码:https://github.com/JackJiang2…

(本文同步公布于:http://www.52im.net/thread-35…

2、专题目录

本文是系列文章的第 3 篇,总目录如下:

《IM 扫码登录技术专题(一):微信的扫码登录性能技术原理调试剖析》
《IM 扫码登录技术专题(二):市面支流的扫码登录技术原理调试剖析》
《IM 扫码登录技术专题(三):通俗易懂,IM 扫码登录性能具体原理一篇就够》(* 本文)

3、二维码登录的实质

3.1 扫码登录平安吗?
在 2 维码扫码登录的过程中,大家可能会有疑难:这二维码平安吗?会不会透露我的个人信息?我的 im 零碎敢不敢也搞一个扫码登录呢?

针对这些顾虑,咱们须要理解一下二维码扫码登录背地的技术和逻辑实质。

3.2 扫码登录的技术实质
二维码扫码登录实质上也是一种登录认证形式。

既然是登录认证,要做的也就两件事件:

1)通知零碎我是谁;
2)向零碎证实我是谁。
举个理论的例子来了解一下:

比方账号密码登录:账号就是通知零碎我是谁,明码就是向零碎证实我是谁;
比方手机验证码登录:手机号就是通知零碎我是谁,验证码就是向零碎证实我是谁。
那么扫码登录是怎么做到这两件事件的呢?

以微作的扫码登录为例:手机端利用扫 PC 端二维码,手机端确认后,账号就在 PC 端登录胜利了!这里,PC 端登录的账号必定与手机端是同一个账号。不可能手机端登录的是账号 A,而扫码登录当前,PC 端登录的是账号 B。

所以,第一件事件——“通知零碎我是谁”,是比较清楚的!

PS:通过扫描二维码,把手机端的账号信息传递到 PC 端,至于具体是怎么传的,咱们前面再说。

第二件事件:“向零碎证实我是谁”。扫码登录过程中,用户并没有去输出明码,也没有输出验证码,或者其余什么码。那是怎么证实的呢?

有些同学会想到,是不是扫码过程中,把明码传到了 PC 端呢?

但这是不可能的。因为那样太不平安的,客户端也基本不会去存储明码。

咱们认真想一下,其实手机端 APP 它是曾经登录过的,就是说手机端是曾经通过登录认证。所说只有扫码确认是这个手机且是这个账号操作的,其实就能间接证实我谁。

4、意识二维码

那么如何做扫码登陆的确认呢?咱们前面会具体阐明,在这之前咱们须要先认识一下二维码!在意识二维码之前咱们先看一下一维码!

▲ 这就是一维码

所谓一维码,也就是条形码,条形码实际上就是一串数字,以平时生存中的商品为例,它下面的一维码存储的就是商品的编号。

二维码其实与条形码相似,只不过它存储的不肯定是数字,还能够是任何的字符串,你能够认为,它就是字符串的另外一种表现形式。

在搜索引擎中搜寻二维码,你能够找到很多在线生成二维码的工具网站,这些网站能够提供字符串与二维码之间互相转换的性能,比方 草料二维码网站。

▲ 输出一段字符串就能生成二维码

在右边的输入框就能够输出你的内容,它能够是文本、网址,文件 ……..。而后就能够生成代表它们的二维码。

▲ 这是二维码(曾经将内容含糊解决)

你也能够把二维码上传,进行”解码“,而后就能够解析出二维码代表的含意。

5、传统零碎是如何登陆认证的?

意识了二维码,咱们理解一下挪动互联网下的传统登录认证机制。

后面咱们说过,为了平安,手机端它是不会存储你的登录明码的。然而在日常应用过程中,咱们应该会留神到,只有在你的利用下载下来后,第一次登录的时候,才须要进行一个账号密码的登录,那之后呢 即便这个利用过程被杀掉,或者手机重启,都是不须要再次输出账号密码的,它能够主动登录。

其实这背地就是一套基于 token 的认证机制,咱们来看一下这套机制是怎么运行的。

如上图所示:

1)账号密码登录时,客户端会将设施信息一起传递给服务端;
2)如果账号密码校验通过,服务端会把账号与设施进行一个绑定,存在一个数据结构中,这个数据结构中蕴含了账号 ID、设施 ID、设施类型等等。
const token = {

acountid: ‘ 账号 ID’,

deviceid: ‘ 登录的设施 ID’,

deviceType: ‘ 设施类型,如 iso,android,pc……’,

}

而后服务端会生成一个 token,用它来映射数据结构,这个 token 其实就是一串有着非凡意义的字符串,它的意义就在于,通过它能够找到对应的账号与设施信息。

具体是:

1)客户端失去这个 token 后,须要进行一个本地保留,每次拜访零碎 API 都携带上 token 与设施信息;
2)服务端就能够通过 token 找到与它绑定的账号与设施信息,而后把绑定的设施信息与客户端每次传来的设施信息进行比拟,如果雷同,那么校验通过,返回 AP 接口响应数据,如果不同,那就是校验不通过回绝拜访。
从后面这个流程,咱们能够看到,客户端不会也没必要保留你的明码,相同,它是保留了 token。

可能有些同学会想,这个 token 这么重要,万一被他人晓得了怎么办。

实际上:晓得了也没有影响,因为设施信息是惟一的,只有你的设施信息他人不晓得,他人拿其余设施来拜访,验证也是不通过的。

能够说,客户端登录的目标,就是取得属于本人的 token。

限于篇幅,这方面的文章,能够具体读一下以下几篇:

《IM 开发基础知识补课(一):正确理解前置 HTTP SSO 单点登陆接口的原理》

《IM 开发基础知识补课(四):正确理解 HTTP 短连贯中的 Cookie、Session 和 Token》

《IM 开发基础知识补课(七):支流挪动端账号登录形式的原理及设计思路》(举荐)

那么在扫码登录过程中,PC 端是怎么取得属于本人的 token 呢?不可能手机端间接把本人的 token 给 PC 端用!token 只能属于某个客户端公有,其他人或者是其余客户端是用不了的。

在剖析这个问题之前,咱们有必要先梳理一下,扫描二维码登录的个别步骤是什么样的。这能够帮忙咱们梳理分明整个过程。

6、扫码登录的具体技术步骤

6.1 大略流程

如上图所示:

1)扫码前,手机端利用是已登录状态,PC 端显示一个二维码,期待扫描;
2)手机端关上利用,扫描 PC 端的二维码,扫描后,会提醒“已扫描,请在手机端点击确认”;
3)用户在手机端点击确认,确认后 PC 端登录就胜利了。
能够看到,二维码在两头有三个状态:待扫描、已扫描待确认、已确认。

那么能够设想:

具体解释就是:

1)二维码的背地它肯定存在一个唯一性的 ID,当二维码生成时,这个 ID 也一起生成,并且绑定了 PC 端的设施信息;
2)手机去扫描这个二维码;
3)二维码切换为 已扫描待确认状态,此时就会将账号信息与这个 ID 绑定;
4)当手机端确认登录时,它就会生成 PC 端用于登录的 token,并返回给 PC 端。
好了,到这里,基本思路就曾经清晰了,接下来咱们把整个过程再具体化一下。

6.2 二维码筹备
按二维码不同状态来看,首先是期待扫描状态,用户关上 PC 端,切换到二维码登录界面时。

如上图所示:

1)PC 端向服务端发动申请,通知服务端,我要生成用户登录的二维码,并且把 PC 端设施信息也传递给服务端;
2)服务端收到申请后,它生成二维码 ID,并将二维码 ID 与 PC 端设施信息进行绑定;
3)而后把二维码 ID 返回给 PC 端;
4)PC 端收到二维码 ID 后,生成二维码(二维码中必定蕴含了 ID);
5)为了及时晓得二维码的状态,客户端在展示二维码后,PC 端一直的轮询服务端,比方每隔一秒就轮询一次,申请服务端通知以后二维码的状态及相干信息。
二维码曾经准好了,接下来就是扫描状态。

6.3 扫描状态切换

如上图所示:

1)用户用手机去扫描 PC 端的二维码,通过二维码内容取到其中的二维码 ID;
2)再调用服务端 API 将挪动端的身份信息与二维码 ID 一起发送给服务端;
3)服务端接管到后,它能够将身份信息与二维码 ID 进行绑定,生成长期 token。而后返回给手机端;
4)因为 PC 端始终在轮询二维码状态,所以这时候二维码状态产生了扭转,它就能够在界面上把二维码状态更新为已扫描。
那么为什么须要返回给手机端一个长期 token 呢?

长期 token 与 token 一样,它也是一种身份凭证,不同的中央在于它只能用一次,用过就生效。

在上图中的第三步骤中返回长期 token,为的就是手机端在下一步操作时,能够用它作为凭证。以此确保扫码,登录两步操作是同一部手机端收回的。

6.4 状态确认
最初就是状态的确认了。

如上图所示:

1)手机端在接管到长期 token 后会弹出确认登录界面,用户点击确认时,手机端携带长期 token 用来调用服务端的接口,通知服务端,我曾经确认;
2)服务端收到确认后,依据二维码 ID 绑定的设施信息与账号信息,生成用户 PC 端登录的 token;
3)这时候 PC 端的轮询接口,它就能够得悉二维码的状态曾经变成了 ” 已确认 ”。并且从服务端能够获取到用户登录的 token;
4)到这里,登录就胜利了,后端 PC 端就能够用 token 去拜访服务端的资源了。
扫码动作的根底流程都讲完了,有些细节还没有深刻介绍。

比方二维码的内容是什么?

1)能够是二维码 ID;
2)能够是蕴含二维码 ID 的一个 url 地址。
在扫码确认这一步,用户勾销了怎么解决?这些细节都留给大家思考。

7、本文小结

艰深地总结一下本文的扫码登陆逻辑就是:

扫码登录的实质就是:

  • 1)通知零碎我是谁;
  • 2)向零碎证实我谁。

在这个过程中,咱们先简略讲了两个前提常识:

  • 1)一个是二维码原理;
  • 2)一个是基于 token 的认证机制。

而后咱们以二维码状态为轴,剖析了这背地的逻辑: 通过 token 认证机制与二维码状态变动来实现扫码登录。

须要指出的是,后面的讲的登录流程,它适同样用于同一个零碎的 PC 端,WEB 端,挪动端。

平时咱们还有另外一种场景也比拟常见,那就是通过第三方利用来扫码登录,比方极客工夫 / 掘金 都能够抉择微信 /QQ 等扫码登录,那么这种通过第三方利用扫码登录又是什么原理呢?

感兴趣的同学能够思考钻研一下,欢送在评论留下你的见解。

附录:更多 IM 开发热门常识

《新手入门一篇就够:从零开发挪动端 IM》
《挪动端 IM 开发者必读(一):通俗易懂,了解挪动网络的“弱”和“慢”》
《挪动端 IM 开发者必读(二):史上最全挪动弱网络优化办法总结》
《从客户端的角度来谈谈挪动端 IM 的音讯可靠性和送达机制》
《古代挪动端网络短连贯的优化伎俩总结:申请速度、弱网适应、平安保障》
《腾讯技术分享:社交网络图片的带宽压缩技术演进之路》
《小白必读:闲话 HTTP 短连贯中的 Session 和 Token》
《IM 开发基础知识补课:正确理解前置 HTTP SSO 单点登录接口的原理》
《挪动端 IM 中大规模群音讯的推送如何保障效率、实时性?》
《挪动端 IM 开发须要面对的技术问题》
《开发 IM 是本人设计协议用字节流好还是字符流好?》
《请问有人晓得语音留言聊天的支流实现形式吗?》
《IM 音讯送达保障机制实现(一):保障在线实时音讯的牢靠投递》
《IM 音讯送达保障机制实现(二):保障离线音讯的牢靠投递》
《如何保障 IM 实时音讯的“时序性”与“一致性”?》
《一个低成本确保 IM 音讯时序的办法探讨》
《IM 单聊和群聊中的在线状态同步应该用“推”还是“拉”?》
《IM 群聊音讯如此简单,如何保障不丢不重?》
《谈谈挪动端 IM 开发中登录申请的优化》
《挪动端 IM 登录时拉取数据如何作到省流量?》
《浅谈挪动端 IM 的多点登录和音讯漫游原理》
《齐全自已开发的 IM 该如何设计“失败重试”机制?》
《通俗易懂:基于集群的挪动端 IM 接入层负载平衡计划分享》
《微信对网络影响的技术试验及剖析(论文全文)》
《即时通讯零碎的原理、技术和利用(技术论文)》
《开源 IM 工程“蘑菇街 TeamTalk”的现状:一场有始无终的开源秀》
《QQ 音乐团队分享:Android 中的图片压缩技术详解(上篇)》
《QQ 音乐团队分享:Android 中的图片压缩技术详解(下篇)》
《腾讯原创分享(一):如何大幅晋升挪动网络下手机 QQ 的图片传输速度和成功率》
《腾讯原创分享(二):如何大幅压缩挪动网络下 APP 的流量耗费(上篇)》
《腾讯原创分享(三):如何大幅压缩挪动网络下 APP 的流量耗费(下篇)》
《如约而至:微信自用的挪动端 IM 网络层跨平台组件库 Mars 已正式开源》
《基于社交网络的 Yelp 是如何实现海量用户图片的无损压缩的?》
《腾讯技术分享:腾讯是如何大幅升高带宽和网络流量的(图片压缩篇)》
《腾讯技术分享:腾讯是如何大幅升高带宽和网络流量的(音视频技术篇)》
《字符编码那点事:疾速了解 ASCII、Unicode、GBK 和 UTF-8》
《全面把握挪动端支流图片格式的特点、性能、调优等》
《子弹短信光鲜的背地:网易云信首席架构师分享亿级 IM 平台的技术实际》
《IM 开发基础知识补课(五):通俗易懂,正确理解并用好 MQ 音讯队列》
《微信技术分享:微信的海量 IM 聊天音讯序列号生成实际(算法原理篇)》
《自已开发 IM 有那么难吗?手把手教你自撸一个 Andriod 版繁难 IM (有源码)》
《融云技术分享:解密融云 IM 产品的聊天音讯 ID 生成策略》
《IM 开发基础知识补课(六):数据库用 NoSQL 还是 SQL?读这篇就够了!》
《适宜老手:从零开发一个 IM 服务端(基于 Netty,有残缺源码)》
《拿起键盘就是干:跟我一起徒手开发一套分布式 IM 零碎》
《适宜老手:手把手教你用 Go 疾速搭建高性能、可扩大的 IM 零碎(有源码)》
《IM 里“左近的人”性能实现原理是什么?如何高效率地实现它?》
《IM 开发基础知识补课(七):支流挪动端账号登录形式的原理及设计思路》
《IM 开发基础知识补课(八):史上最艰深,彻底搞懂字符乱码问题的实质》
《IM“扫一扫”性能很好做?看看微信“扫一扫识物”的残缺技术实现》
《IM 的扫码登录性能如何实现?一文搞懂支流利用的扫码登录技术原理》
《IM 要做手机扫码登录?先看看微信的扫码登录性能技术原理》
《IM 音讯 ID 技术专题(一):微信的海量 IM 聊天音讯序列号生成实际(算法原理篇)》
《IM 音讯 ID 技术专题(二):微信的海量 IM 聊天音讯序列号生成实际(容灾计划篇)》
《IM 音讯 ID 技术专题(三):解密融云 IM 产品的聊天音讯 ID 生成策略》
《IM 音讯 ID 技术专题(四):深度解密美团的分布式 ID 生成算法》
《IM 音讯 ID 技术专题(五):开源分布式 ID 生成器 UidGenerator 的技术实现》
《IM 音讯 ID 技术专题(六):深度解密滴滴的高性能 ID 生成器(Tinyid)》
《IM 开发宝典:史上最全,微信各种性能参数和逻辑规定材料汇总》
《IM 开发干货分享:我是如何解决大量离线音讯导致客户端卡顿的》
《零根底 IM 开发入门(一):什么是 IM 零碎?》
《零根底 IM 开发入门(二):什么是 IM 零碎的实时性?》
《零根底 IM 开发入门(三):什么是 IM 零碎的可靠性?》
《零根底 IM 开发入门(四):什么是 IM 零碎的音讯时序一致性?》
《IM 开发干货分享:如何优雅的实现大量离线音讯的牢靠投递》
《IM 开发干货分享:有赞挪动端 IM 的组件化 SDK 架构设计实际》
《一套亿级用户的 IM 架构技术干货(下篇):可靠性、有序性、弱网优化等》

更多同类文章 ……

本文已同步公布于“即时通讯技术圈”公众号。

▲ 本文在公众号上的链接是:点此进入。同步公布链接是:http://www.52im.net/thread-35…

正文完
 0