首页 > 编程知识 正文

微信二维码登录原理是什么,二维码登录实现原理

时间:2023-05-05 23:42:06 阅读:248282 作者:268

网页登陆是微信4.2以后版本提供的一种全新的登陆方式。用户只需要用手机扫一扫微信网页中的二维码,就能马上实现微信网页登陆。

这种登陆方式虽然炫酷,但是多少有些违背直觉:

网页端是怎么知道是哪个微信账号扫它的呢?前后两个事件是如何联系起来的呢?这种登陆方式安全么?为什么微信选择这种验证方式呢?这种登陆方式还可以延伸到其他应用场景么?

出于对这些问题的好奇,我和dpdbd做了一番探索~

实现机制

今天dpdbd在刚买的笔记本上体验了一把网页微信。他是这么做的:

在网页打开https://wx.qq.com/,这时网页显示的是一个二维码。用手机打开微信,使用扫一扫功能扫描屏幕上的二维码。扫描成功后,手机微信询问是否确认登陆网页版微信,点击确认后网页微信登陆成功。

让我们慢镜头重放这个过程:
当高高的水杯访问 https://wx.qq.com/,他在网页中得到一个二维码。

在这个过程中,高高的水杯的浏览器和微信服务器之间建立了一个阻塞的长链接,同时服务器还专门为高高的水杯新开了一个有独立UID为SWJNSjNJblBJQT09的Session,并把这个UID嵌入到二维码中返回。

注意,这个UID只是一个随机不重复数,并不是Session ID。

高高的水杯看到二维码后,使用手机微信中的扫一扫功能读取了二维码中的UID。手机微信把具有高高的水杯身份信息的token A和这个SWJNSjNJblBJQT09的UID打包并做一些特殊的处理后,发给微信服务器进行确认。

dpdbd: 我们可以使用其他二维码扫描软件来登陆吗?
Cosmo: 二维码的转码规则是统一的。任何二维码扫描软件都可扫除里面包含的信息。比如上图扫出的结果是https://login.weixin.qq.com/l/IbMJ3InPIA==。但是只有微信app能够把包含用户身份信息的token和这个扫描结果做处理,然后与微信服务器通信,告知它是高高的水杯扫了这个二维码。所以,重要的不是扫描二维码中的信息,而是谁扫描了这个信息。

当微信服务器通过确认时,它已经同时获得了用户高高的水杯和UID为SWJNSjNJblBJQT09的网页端的信息,并知道高高的水杯将要通过UID为 SWJNSjNJblBJQT09的Session来访问微信服务。因为高高的水杯是一个真实的用户,所以微信服务器就给UID为SWJNSjNJblBJQT09的Session分配一个token B,让高高的水杯能够在一定限定条件下访问微信服务。由于网页在加载时候已经把大部分相关资源都预先加载进来了,这个长链接得到确认信息后,网页端只需要加载用户列表,所以响应速度很快,也不需要手动刷新。

dpdbd: 限定条件是什么呢?
Cosmo: 具体条件要问腾讯才知道,但是这些限定不外乎限定访问时间、限定同时登陆设备数、电脑休眠后Toekn自动收回等等。

现在,高高的水杯理论上算是登陆成功了。但是为了不显得突兀,微信服务器贴心地给高高的水杯手机发个确认登陆网页版微信的信息,让高高的水杯做最后一个确认操作。

dpdbd: 这种登陆方式安全嘛?
Cosmo: 由于整个验证过程在手机和服务器这个闭环中运行的,有效杜绝了电脑端泛滥的木马和病毒,并且二维码的生成和访问都通过SSL安全通道完成,这种登陆方式在现阶段来说应该是安全的。当然,要保管好手机。

至此为止,高高的水杯成功登陆了网页微信啦!

背后原因

酷炫爽说
zjdxhd多次提到“营销的目的是让用户觉得‘爽’。口碑传播的基础是‘好玩’。爽是体验,体验比功能更易传播。” “趣味性大于功能,用户要的是‘爽’。” 所以,这种登陆方式的提出是微信的一种基于“爽”字的营销手段。

入口争夺说
zjdxhd曾强调“PC的入口在搜索框,手机上的入口在二维码”。所以二维码扫描登陆时微信抢占手机入口的重要一环,日后微信将通过这个入口变革我们的登陆方式,最终变成我们的移动身份证。现成的一个例子就是通过扫描智能电视上的二维码登陆账号。

借鉴说
有一派说法是,微信这个二维码登陆借鉴自日本的Line。有趣的是,目前Line已经关闭这项服务。所以这就是日本人精于战术疏于战略的例子?

移动核心说
这样的设计突出了移动O2O核心,突出了微信是为移动而生的理念。

阴谋论说
微信对腾讯某部门冲击太大,受到限制?(瞎猜的)

总结

引用知乎黄良懿的回复作为微信二维码登陆的总结:

所以说,核心过程应该是:浏览器获得一个临时 id,通过长连接等待客户端扫描带有此 id 的二维码后,从长连接中获得客户端上报给 server 的帐号信息进行展示。 并在客户端点击确认后,获得服务器授信的令牌,进行随后的信息交互过程。 在超时、网络断开、其他设备上登录后,此前获得的令牌或丢失、或失效,对授权过程形成有效的安全防护。

转载于:https://www.cnblogs.com/kaleidoscope/p/9507216.html

java并发编程ReentrantReadWriteLock读写锁详解JavaScript如何使用箭头函数Laravel中如何进行异常处理

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。