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