微信二维码登录原理

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

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

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

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

实现机制

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

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

让我们慢镜头重放这个过程:
当老王访问 ,他在网页中得到一个二维码。

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

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

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

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

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

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

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

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

至此为止,老王成功登陆了网页微信啦!

背后原因

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

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

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

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

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

总结

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

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

posted @ 2018-08-20 18:30  kaleidoscopic  阅读(2280)  评论(0编辑  收藏  举报