`
gaojingsong
  • 浏览: 1153453 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【二维码登录 解析】

阅读更多

1. 每打开一次页面的时候会随机生成一个含有唯一ID的二维码,当然后面带的那个参数是唯一的。XXXXXXXXx?_t=13869253897);

 

2.当用户使用登陆后的来往扫描该二维码的时候,客户端会解析出二维码中的这个唯一ID会将这个id和手机上的来往账号及密码绑定,并上传到服务器;

 

3.来往网页版页面每隔1秒或2秒会get请求该id对应的来往账号及密码,如果id绑定上了来往账号和密码,那么就可以请求到账号和密码,就可以自动登陆了。

 

4.这样实现的目的

1.安全,用户不需要再次输出用户名密码,

2.方便,用户不需要再次输出用户名密码.

3.比如QQ与手机图片互传也是这样一个原理.



 

 

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

网页端是怎么知道是哪个账号扫它的呢?

前后两个事件是如何联系起来的呢?

这种登陆方式安全么?

为什么选择这种验证方式呢?

这种登陆方式还可以延伸到其他应用场景么?

 

 



 

实现机制

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

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

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

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

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

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

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

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

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

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

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

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

  • 大小: 33.8 KB
  • 大小: 90.3 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics