聊聊二维码登陆

本文主要来研究一下二维码登陆的相关场景和原理。php

场景

主要的场景有以下几个:html

  • app扫二维码登陆pc版系统

好比微信web版,在手机端微信登陆的前提下,扫二维码确认,自动登陆网页版。这里的app能够分为两大类,一个是自有的app,一个是第三方的app。git

本身的app自有认证体系,在登陆前提下完成pc端的扫描登陆。
第三方app扫描登陆场景,好比使用手机端的微信APP扫描登陆PC端系统,这种状况下,通常是利用微信的oauth体系,服务端完成自有帐户体系与微信帐号的绑定,而后实现PC端的自动登陆
  • app扫二维码做为双因素验证

好比微信公众号平台,在帐户密码登陆PC端的状况下,再使用手机端微信登陆的前提下,扫描二维码再次确认,登陆网页版github

  • Secure QR Login (SQRL)

彻底使用二维码登陆,替代用户密码。这个有SQRL协议及相关实现。web

步骤

如下全部的都基于这个前提,就是手机app已经登陆,自带有登陆的凭证,而后要扫描登陆pc端的系统redis

  • 打开pc端显示登陆二维码(pc端未登陆的前提下)
这个时候请求服务端生成一个登录二维码
服务端生成二维码,该二维码包含了这个pc端的惟一标识,好比sessionId,或者是新生成一个uuid跟这个sessionId关联
  • pc端同时开启轮询(有长链接等其余实现,这里以轮询方式介绍)
获取二维码以后,pc端开启定时轮询,轮询二维码的状态,主要有以下状态:NEW,SCANED,CONFIRMED,REFUSED,EXPIRED
  • 手机端扫描二维码
手机端已经登陆的状况下,扫描网页二维码,二维码状态变为已扫描,而后手机端跳转到确认页面
  • 手机端确认
手机端扫描二维码以后,点击确认,二维码状态变为确认
  • pc端跳转成功/二维码过时/拒绝
二维码状态变为确认以后,跳转自动登陆,完成PC端登陆态创建
若是app端拒绝此次请求,则二维码状态变为被拒绝,再也不轮询
若是二维码状态在必定时间没有变化,则显示二维码过时,再也不轮询

PC客户端

  • 请求登陆二维码
  • 轮询二维码状态
  • 跳到到登录后的页面

手机客户端

  • 扫描登陆二维码
  • 确认登陆

服务端

  • 生成登陆二维码,绑定二维码与pc客户端
  • 处理二维码轮询
  • 处理手机端扫描二维码
  • 处理手机端确认二维码登陆
  • 处理pc端自动登陆

实现

PC端如何自动登陆

这个问题至关于 同一个账号多设备同时登陆的问题

在二维码被具备登陆态的app端扫描确认以后,PC端如何完成自动登陆。有以下几个方案:数据库

  • session拷贝
其实就是在原来基于帐号密码的登陆鉴权逻辑基础上,新增支持无需帐号密码的登陆。也就至关于绕过了基于用户名密码,内部从新设置了一个登陆态
若是是基于session的鉴权,至关于基于原有的一个已经鉴权的session,拷贝信息到另一个新的session中,在server端关联
  • 复用已有token
若是是基于token的鉴权,一种方案就是复用token,让pc端也复用手机app端的token,这样的好处是原来基于token的鉴权逻辑都不用改
  • 仿照oauth受权颁发新token
整个过程其实有点像oauth,pc端是client,server端是资源和认证中心,手机端是具备登陆态的用户。手机端扫描二维码,而后用户确认受权,server端给pc端颁发token,而后pc端就能够访问server端的资源了。这种就在原来的认证基础上支持另一类oauth的token校验,貌似有点复杂
另一个变形是新颁发token,但跟app端的token有个关联映射,最终鉴权的时候还去找原来受权的token去鉴权,这样的好处是原来的token失效,通过它受权的token也失效

二维码过时

一种是基于redis来作过时,一种是使用数据库,可是设置expired time来判断安全

安全问题

QRLJacking全称Quick Response Code Login Jacking,是session劫持的一种。微信

原理

具体是怎么劫持的呢,假设攻击者将web登陆二维码假装为公众号二维码,让用户去扫描,用户一不当心点击确认,攻击者的就能够登陆用户的web系统,或者利用那个token/session去盗取用户的相关信息或作相关操做。session

防范

  • 二维码超时机制

二维码增长超时机制以后,会增长攻击者攻击的难度,不过攻击者也可能利用脚本去自动刷新二维码

  • 确认机制

二维码扫描必定要有这个确认的页面,明确告知用户要作的操做,假设没有确认这个环节,那么是极其容易上当的。另外,二维码扫描确认以后,再往用户app或手机等发送登陆提醒的通知,告知若是不是本人登陆的,则建议用户当即修改密码

  • Sound-based Authentication

确认阶段改成双边语音确认,而不是简单的用户点击确认按钮。语音是根据用户id、二维码id等加密生成,在app端播放,而后pc端语音识别以后才能完成整个登陆过程。这个能够有效防止远程攻击。一样的思路,改语音为one time password也行,增长了确认过程的复杂度,也就增长了攻击的难度。

小结

二维码扫描登陆是个挺潮流的功能,这要求既有系统增长改造,也要求针对这种形式的登陆带来潜在的攻击进行安全防范。

doc

相关文章
相关标签/搜索