专栏首页Java技术栈微信扫码登录是如何实现的?

微信扫码登录是如何实现的?

网页版微信刚推出时,无数人被它的登录方式惊艳了一下,不需要输入用户名密码,打开手机微信扫一扫,便自动登录。从原理上讲,二维码只能是一段文本的编码,如何用它实现快捷登录的呢?

打开网页版微信,可以看到如下的页面:

微信扫码界面

如果你用我查查、支付宝、新浪微博等软件扫码二维码,你会发现此二维码解析出来是如下的网址:

https://login.weixin.qq.com/l/obsbQ-Dzag==

接下来详细介绍一下扫码登录具体的每个步骤:

扫码登录完整流程

①:用户 A 访问微信网页版,微信服务器为这个会话生成一个全局唯一的 ID,上面的 URL 中 obsbQ-Dzag== 就是这个 ID,此时系统并不知道访问者是谁。

②:用户A打开自己的手机微信并扫描这个二维码,并提示用户是否确认登录。

③:手机上的微信是登录状态,用户点击确认登录后,手机上的微信客户端将微信账号和这个扫描得到的 ID 一起提交到服务器

④:服务器将这个 ID 和用户 A 的微信号绑定在一起,并通知网页版微信,这个 ID 对应的微信号为用户 A,网页版微信加载用户 A 的微信信息,至此,扫码登录全部流程完成

扫码登录看起来神奇,主要是因为微信 APP 扫自家的码会做一些普通二维码软件不会做的额外的操作,那就是将当前已登录的微信和扫出来的 ID 提交到微信服务器,类似的应用还有扫码支付、扫码加公众号等功能。

扫码登录原理

扫码登录大概的思路是:微信手机客户端从网页二维码里面得到一些信息,然后发送给网页微信的服务器,网页服务器验证信息并响应。下面,我们借助火狐浏览器提供的Firebug工具看看,到底是怎么一回事儿吧!

1.每次打开微信网页版的时候,都会生成一个含有唯一uid的二维码,而且每次刷新后都会改变。这样可以保证一个uid只可以绑定一个账号和密码,确定登录用户的唯一性。可以通过手机上的UC浏览器提供的扫码功能查看二维码里面的信息,但并不会自动打开该地址。

我刷新三次,扫描结果如下,其中最后面那串数字就是uid:

1) https://login.weixin.qq.com/l/48e24d66bdbc4f 2) https://login.weixin.qq.com/l/0787fb4fa7ad4c 3) https://login.weixin.qq.com/l/92781a4a7f1c47

通过查看网页源码,这个页面在加载完毕时,已经把很多登录后才需要的相关资源都预先加载进来了,所以登录用户得到确认后展示用户信息的速度很快。

2.除了返回唯一的uid,实际上打开这个页面的时候,浏览器跟服务器还创建了一个长连接,请求uid的扫描记录。如果没有,在特定时长后(目前是27秒左右)会接到状态码408(请求超时),表示应该继续下一次请求;如果接到状态码201(服务器创建新资源成功),表示客户端扫描了该二维码。

请求超时:返回408

扫码成功:返回201

长轮询代码结构:

3.当用户使用登录后的微信扫描二维码的时候,会将uid和手机微信产生的token进行绑定,并上传到服务器。这个时候,浏览器通过长轮询查询到uid扫描记录,立即得到201响应码,然后通知服务器,客户端由此也进入一个新的页面(就是那个要你点确认的按钮)。在客户端点击确认后,获得服务器授信的令牌,进行随后的信息交互过程。

结语

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

整理参考

  • www.jianshu.com/p/7f072ac61763
  • justcoding.iteye.com/blog/2213661

本文分享自微信公众号 - Java技术栈(javastack)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 把 14 亿人拉到一个微信群,如何实现?

    根据 2017 年《微信数据报告》的公开数据 [参考 1] :2017 年 9 月,微信日均登陆 9.02 亿人,日均发送消息 380 亿次。

    Java技术栈
  • 5分钟带你理解一致性Hash算法。

    一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot s...

    Java技术栈
  • 翻车了!StackOverflow上复制最多的代码存在缺陷!

    文章转载自 OSCHINA 社区 [http://www.oschina.net]

    Java技术栈
  • 解决SpringSecurity手动退出登录后再次登录成功会重定向到登录界面的问题

    详细再次查阅了SpringSecurity文档发现: SpringSecurity 4 默认退出地址为/logout,并且支持以下配置:

    飞奔去旅行
  • 项目实战|C#Socket通讯方式改造(一)--Socket实现Ftp的上传和下载

    Form的布局里央加入了三个textbox(Ftp的地址,Ftp的端口号和显示状态的文本框),三个button(生成文件,上传文件,下载文件的按钮),如下图:

    Vaccae
  • Jtro的源码分享:客户端通过服务器同步位置消息

    之前的源码讲过如何使用sql留言的功能,今天讲解两个客户端如何通过服务器来同步每个玩家的位置。 首先是服务器端,用到之前的异步socket的服务器了,如果没有...

    LittleU
  • Golang UnitTest单元测试

    单元测试是程序开发者适用一段代码来验证另外一段代码写的是否符合预期的一种相对高效的自我测试方法。

    黑光技术
  • 版本控制工具(CVS、SVN、GIT)简介 原

    版本控制工具:  提供完备的版本管理功能,用于存储、追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是软件公司的基础设施。版本控制软件的最高目标,...

    wuweixiang
  • 如何在Ubuntu 16.04上使用mdadm管理RAID阵列

    通过将各个磁盘组合到特定配置的虚拟存储设备中,RAID阵列可提供更高的性能和冗余。在Linux中,该mdadm实用程序可以轻松创建和管理软件RAID阵列。

    GeekZ
  • 如何在Debian 9上使用mdadm创建RAID阵列

    该mdadm实用程序可用于使用Linux的软件RAID功能创建和管理存储阵列。管理员可以非常灵活地协调各自的存储设备,并创建具有更高性能或冗余特性的逻辑存储设备...

    angel_郁

扫码关注云+社区

领取腾讯云代金券