我们举个简单例子,我们平时生活中二维码移动、PC登陆是很长见的事情,那么这个简单的实现蕴藏着很多的技术,这里我只是对于移动扫描登陆这种场景进行分析下,不对之处请各位大佬指出。
举个例子,我们一般常用的阿里系应用,支付宝和阿里云服务平台之间的登陆,我们手机一般 支付宝保持着登陆状态,在PC端使用阿里云的时候我一般不习惯于账号、密码登陆方式,而是直接扫描二维码登录:
这里是一个登陆的典型页面,大致过程首先我们点开登陆选择二维码登录方式,拿出我们的手机扫描二维码,扫描成功后手机就会重定向到扫描登陆确认界面,确认是否是本地人登陆,确认后?PC端提示已扫描请确认,确认后PC登陆成功。大概流程如下:
扫码前,手机端应用是已登录状态,PC 端显示一个二维码,等待扫描
手机端打开应用,扫描 PC 端的二维码,扫描后,会提示"已扫描,请在手机端点击确认"
用户在手机端点击确认,确认后 PC 端登录就成功
二维码的背后它一定存在一个唯一性的 ID,当二维码生成时,这个 ID 也一起生成,并且绑定了 PC 端的设备信息
手机去扫描这个二维码
二维码切换为 已扫描待确认状态, 此时就会将账号信息与这个 ID 绑定
当手机端确认登录时,它就会生成 PC 端用于登录的 token,并返回给 PC 端
二维码准备阶段,就是我们在PC端,点击登陆并选择扫码登陆
PC 端向服务端发起请求,告诉服务端,我要生成用户登录的二维码,并且把 PC 端设备信息也传递给服务端
服务端收到请求后,它生成二维码 ID,并将二维码 ID 与 PC 端设备信息进行绑定
然后把二维码 ID 返回给 PC 端
PC 端收到二维码 ID 后,生成二维码(二维码中肯定包含了 ID)
为了及时知道二维码的状态,客户端在展现二维码后,PC 端不断的轮询服务端,比如每隔一秒就轮询一次,请求服务端告诉当前二维码的状态及相关信息
进行扫描
用户用手机去扫描 PC 端的二维码,通过二维码内容取到其中的二维码 ID
再调用服务端 API 将移动端的身份信息与二维码 ID 一起发送给服务端
服务端接收到后,它可以将身份信息与二维码 ID 进行绑定,生成临时 token。然后返回给手机端
因为 PC 端一直在轮询二维码状态,所以这时候二维码状态发生了改变,它就可以在界面上把二维码状态更新为已扫描
手机端确认
手机端在接收到临时 token 后会弹出确认登录界面,用户点击确认时,手机端携带临时 token 用来调用服务端的接口,告诉服务端,我已经确认
服务端收到确认后,根据二维码 ID 绑定的设备信息与账号信息,生成用户 PC 端登录的 token
这时候 PC 端的轮询接口,它就可以得知二维码的状态已经变成了"已确认"。并且从服务端可以获取到用户登录的 token
到这里,登录就成功了,后端 PC 端就可以用 token 去访问服务端的资源了
整个扫描登陆的过程大致流程就是这样。