关于后端:一图搞懂扫码登录的技术原理

9次阅读

共计 3604 个字符,预计需要花费 10 分钟才能阅读完成。

当初扫码登录是一种很常见的登录形式。当用户须要登录某个网站时,网站会提供一种扫码登录的形式,用户关上相应的手机 App,扫描网站上显示的二维码,而后在 App 中确认登录,网站监测到用户确认登录后,跳转到登录胜利页面。从这个模式上看,扫码登录就是将用户在手机 App 中的登录状态同步到网站中,这篇文章就来一窥这个同步是如何产生的。

同一产品中的扫码登录

假如有一款产品,这个产品通过手机端 App 和 PC 端利用为用户提供服务,为了不便用户在 PC 端上登录,产品提供了一个扫码登录的性能,即 PC 端利用上展现一个登录二维码,用户应用手机端 App 扫码并确认登录,而后用户就能够在 PC 端上登录胜利。在这个例子中,手机端 App 和 PC 端利用同属于一个产品,这是一种常见的产品状态,微信、微博、知乎等等都是这种产品状态的代表。

为了不便介绍,这里再假如 PC 端利用是一个 Web 站点,上面就来看一下这种登录形式的运作原理:

如上图所示,整个过程比较简单,这里大略分为如下几个步骤:

1、用户发动二维码登录:此时网站会学生成一个二维码,同时把这个二维码对应的标识保存起来,以便跟踪二维码的扫码状态,而后将二维码页面返回到浏览器中;浏览器先展现这个二维码,再依照 Javascript 脚本的批示发动扫码状态的轮询。所谓轮询就是浏览器每隔几秒调用网站的 API 查问二维码的扫码登录后果,查问时携带二维码的标识。有的文章说这里能够应用 WebSocket,尽管 WebSocket 响应比拟及时,然而从兼容性和复杂度思考,大部分计划还是会抉择轮询或者长轮询,毕竟此时通信略微提早下也没多大关系。

2、用户扫码确认登录:用户关上手机 App,应用 App 自带的扫码性能,扫描浏览器中展示的二维码,而后 App 提取出二维码中的登录信息,显示登录确认的页面,这个页面能够是 App 的 Native 页面,也能够是近程 H5 页面,这里采纳 Native 页面,用户点击确认或者批准按钮后,App 将二维码信息和以后用户的 Token 一起提交到网站 API,网站 API 确认用户 Token 无效后,更新在步骤 1 中创立的二维码标识的状态为“确认登录”,同时绑定以后用户。

3、网站验证登录胜利:在步骤 1 中,二维码登录页面启动了一个扫码状态的轮询,如果用户曾经“确认登录”,则轮询拜访网站 API 时,网站会生成二维码绑定用户的登录 Session,而后向前端返回登录胜利音讯。这里登录状态保护是采纳的 Session 机制,也能够换成其它的机制,比方 JWT。

为了保障登录的平安,有必要采取一些安全措施,可能包含以下若干办法:

  • 对二维码承载的信息依照某种规定进行解决,App 能够在扫码时进行验证,防止任何扫码都去申请登录;
  • 对二维码设置一个过期工夫,过期就主动删除,这样使其占用的资源放弃在正当范畴之内;
  • 限度二维码只能应用一次,避免重放攻打;
  • 二维码应用足够长的随机性字符串,避免被歹意穷举占用;
  • 应用 HTTPS 传输,爱护登录数据不被窃听和篡改。

第三方利用的扫码登录

当初很多网站除了提供本身账号的登录形式以外,还提供了微信扫码登录、微博扫码登录等形式,原本这对用户来说是非常不便的,不过很多站点为了获取用户手机号,首次登录时还须要用手机验证码再登录一次,用户会有点被坑骗的感觉,不过这个问题不是本文要探讨的。

这里以微信扫码登录某网站为例,某网站就是第三方利用,所谓第三方是绝对微信本身来说的。相比同一产品中的扫码登录,网站应用微信扫码登录会更简单一些,因为这波及到不同利用之间的登录平安。上面就给出这一登录形式的具体运作原理,时序图比拟长,不过只有急躁点就能齐全搞清楚,甚至本人实现一个相似的第三方扫码登录计划。

这里对一些关键点特地阐明下:

1、步骤 3 生成微信登录申请记录:当用户扫码并批准登录之后,步骤 25 中浏览器会重定向到第三方利用,如果之前没有创立一条登录申请记录,网站并不能确定这次登录就是本人发动的,这可能导致跨站申请伪造攻打。比方应用某个利用的微信登录二维码,骗取用户的受权,而后最终回调跳转到其它站点,被回调站点只能被动承受,尽管下一步验证受权 Code 通不过,微信也可能会认为第三方利用出了某种问题,搞不好被封掉。因而第三方利用创立一条登录申请记录之后,还要把记录的标识拼接到拜访微信登录二维码的 url 中,微信会在用户批准登录后原样返回这个标识,步骤 26 中第三方利用能够验证这个标识是不是无效的。

2、步骤 17 显示利用名称和申请受权信息:因为微信反对很多的第三方利用,须要明确告知用户正在登录哪个利用,利用能够拜访本人的什么信息,这都是用户做出登录决定的必要信息。因而扫码之后,微信手机端就须要去微信开放平台查问下二维码对应的第三方利用信息。

3、步骤 24 登录长期受权 Code:微信开放平台没有间接向浏览器返回登录用户的信息,这是因为第三方利用还须要对用户进行受权并放弃会话的状态,这适宜在利用的服务端来解决;而且间接返回用户信息到浏览器也是不平安的,并不能保障二维码登录申请就是通过指定的第三方利用发动的。第三方利用会在步骤 27 中携带这个受权 Code,加上利用的 AppId 和 AppSecret,再去向微信开放平台发动登录申请,长期受权 Code 只能应用 1 次,存下来也不能再用,且只能用在指定的利用(即绑定了 AppId),AppSecret 是利用从服务端提取的,用来验证利用的身份,这些措施保障了微信受权登录的安全性。不过验证通过后还是没有间接返回用户信息,而是返回了一个 access token,利用能够应用这个 token 再去申请获取用户信息的接口,这是因为开放平台提供了很多接口,拜访这些接口都须要有受权才行,所以发放了一个 access token 给第三方利用,这种受权登录形式叫做 OAuth 2.0。基于平安方面的思考,access token 的有效期比拟短,开放平台个别还会发放一个 refresh token,access token 过期之后,第三方利用能够拿着这个 refresh token 再去换一个新的 access token,如果 refresh token 也过期了或者用户勾销了受权,则不能获取到新的 access token,第三方利用此时应该登记用户的登录。这些 token 都不能透露,所以须要保留在第三方利用的服务端。

这里有一个有意思的问题: 为什么微信的二维码登录页面 Url 中没有第三方利用的签名?

以极客工夫的这个微信登录二维码页面的 Url 为例:

https://open.weixin.qq.com/co…

其中 appid 是微信开放平台调配给极客工夫的利用 Id;redirect_uri 是用户受权登录后微信回调的极客工夫 url,尽管看起来很长,其实就是在极客工夫内的页面之间跳来跳去;state 是极客工夫生成的一个登录 id,不同的 state 会生成不同的二维码,微信回调极客工夫的时候会带着这个 state。

这个 url 中只有极客工夫的 appid,没有极客工夫的签名,也就是说微信会生成极客工夫的登录二维码,然而不验证这个二维码登录申请是不是极客工夫发动的,那么任何人都能够生成极客工夫的微信登录二维码页面。这如同不太谨严。

这样平安吗?攻击者能够很简略的获取某个利用的微信登录二维码,而后再骗取用户的登录受权(这个也绝对简略,弄个混充的网站,或者间接话术忽悠,用户很可能不认真看扫码确认的内容),再通过浏览器拦挡或者 DNS 攻打获取到长期受权 Code,间接越过查看利用 State,前边这些都绝对容易。然而向微信验证长期受权 Code 的时候必须携带 App Secret,这个就很难了,除非第三方利用开发者本人透露了这一外围秘密。对于用户信息的爱护,整体上来说是平安的,攻击者基本上拿不到拜访用户信息的 access token。如果在 url 中加上这个签名,对用户信息的爱护作用也没有增强,受权 Code 还是很容易获取;而且签名个别也是依赖 App Secret,如果透露了 App Secret,签名也就失去了意义。

如果有人一直地生成某个利用的微信登录二维码怎么办?这是其余类型的攻打了,微信能够采取一些限流措施,甚至间接封掉某些 IP,这对失常用户没什么影响。

微信二维码登录的变种

微信除了跳转到二维码登录页面的形式,还提供了第三方网站中内嵌二维码的形式。通过微信 JS SDK 生成二维码并在网页的指定区域展示,用户扫码批准登录后,微信 JS SDK 发动重定向或者在 iframe 中关上利用回调页面,传递长期受权 Code 和利用 State,后续的流程就都一样了。

另外这里的第三方利用如果是挪动端 App,微信开放平台也反对扫码登录的形式,区别在于须要集成微信 SDK,获取二维码和接管用户受权 Code 都是通过 SDK 回调的形式,后续的流程也都一样。


以上就是本文的次要内容了,鉴于自己满腹经纶,如有错漏欢送斧正。

播种更多架构常识,请关注公众号 萤火架构。原创内容,转载请注明出处。

正文完
 0