在日常生活中,二维码出现在很多场景中,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员提供技术选型的新思路。对于非技术人员来说,除了迷惑之外,还可以引导他更好的识别生活中遇到的各种二维码,防止上当受骗。二维码,大家都很熟悉了。购物扫码,吃饭扫码,乘车扫码。在扫码的过程中,你可能会有疑问:这个二维码安全吗?我的个人信息会被泄露吗?更深入的用户还会考虑:我的系统也可以用二维码推广吗?这时候你就需要了解二维码背后的技术和逻辑了!二维码最常用的场景之一是通过手机应用程序扫描PC或WEB上的二维码登录同一系统。例如,手机端扫描微信二维码登录PC端微信,手机端扫描淘宝二维码登录PC端淘宝。那么让我们来看看二维码登录是如何实现的吧!二维码登录的本质二维码登录本质上是一种登录认证方式。既然是登录认证,就只有两件事要做!告诉系统我是谁,向系统证明我是谁。比如用账号密码登录,账号是告诉系统我是谁,密码是向系统证明我是谁;比如用手机验证码登录,手机号就是告诉系统我是谁。就是要向系统证明我是谁;那么扫码登录是如何做到这两件事的呢?我们考虑用手机APP扫描PC端的二维码。手机端确认后,PC端账号登录成功!这里PC端登录的账号必须和移动端的账号一致。手机端A账号无法登录,PC端扫码登录后B账号登录。所以,首先要告诉系统我是谁,这样就比较清楚了!通过扫描二维码,将手机上的账户信息传输到PC端。至于怎么传,后面再说。第二件事是向系统证明我是谁。在扫码登录过程中,用户没有输入密码,也没有输入验证码,也没有输入任何其他代码。这是如何证明的?可能有同学会疑惑,密码是不是在扫描的过程中传给了PC?但这是不可能的。因为那样太不安全,客户端根本不会存储密码。我们仔细想想。其实手机上的APP已经登录过了,也就是说手机已经通过了登录认证。所以只要你扫一下二维码,确认是这个手机,操作这个账号,其实就可以间接证明我是谁。知道二维码,那么如何确认呢?稍后我们会详细解释,但在此之前,我们需要先了解二维码!了解二维码之前,先来看看一维码吧!所谓一维码,也就是条形码,超市里的条形码——这个相信大家都很熟悉了。条形码实际上是一串数字,上面存放着商品的序列号。二维码其实和条形码很相似,只不过它不一定存储数字,还可以是任意字符串。你可以认为它是字符串的另一种表达形式。在搜索引擎中搜索二维码。您可以找到许多用于生成二维码的在线工具。这些站点可以提供字符串和二维码之间的转换功能。在左边的输入框中,你可以输入你的内容,可以是文本,URL,文件……。然后可以生成代表它们的二维码。也可以上传二维码并“解码”,然后就可以分析二维码的含义了。系统认证机制了解了二维码,我们再来看看移动互联网下的系统认证机制。正如我们之前所说,出于安全原因,它不会将您的登录密码存储在手机上。但在日常使用过程中,我们要注意的是,您只需要在下载您的应用后首次登录时,使用账号和密码登录即可。那之后呢?即使杀掉应用进程或重启手机,也无需再次输入账号密码,即可自动登录。其实这背后是一个基于token的认证机制。让我们来看看这个机制是如何工作的。当使用账号和密码登录时,客户端会将设备信息传递给服务器。如果账号和密码验证通过,服务器会将账号和设备绑定,有一个数据结构,包含账号ID,设备ID,设备类型等。consttoken={acountid:'accountID',deviceid:'登录的设备ID',deviceType:'设备类型,比如iso,android,pc...',}然后服务端会生成一个token,用它来映射数据结构,这个token其实就是一个string一串具有特殊含义的字符串,它的意义在于可以通过它找到对应的账号和设备信息。客户端获取token后需要保存在本地,每次访问系统API时都携带token和设备信息。服务端可以通过令牌找到绑定的账号和设备信息,然后将绑定的设备信息与客户端每次发送的设备信息进行比较。如果相同则验证通过,返回AP接口响应数据,如果不同,则表示验证未通过,拒绝访问。从前面的流程可以看出,客户端不会也不需要保存你的密码,相反,它保存了token。可能有的同学会觉得,这个token这么重要,万一被别人知道了怎么办。其实知不知道也没关系,因为设备信息是唯一的。只要您的设备信息不为他人所知,而他人通过其他设备访问,则验证不会通过。可以说,客户端登录的目的就是为了获取自己的token。那么PC在扫码登录过程中如何获取自己的token呢?移动端不可能直接给PC端使用自己的token!令牌只能为某个客户私人所有,不能被其他人或其他客户使用。在分析这个问题之前,我们有必要梳理一下扫描二维码登录的大致步骤,这样可以帮助我们理清整个流程。扫码登录的一般步骤。扫码前,手机端应用已登录。PC端显示二维码。等待扫描打开手机上的应用程序。扫描PC上的二维码。扫描完成后会提示“已扫描,请在手机端点击确认”,用户在手机端点击确认。确认后,PC端登录成功。可以看到二维码中间有三种状态,等待扫描、扫描待确认、确认。那么可以想象,二维码后面一定有一个唯一的ID。生成二维码的时候,这个ID也一起生成,把PC上的设备信息绑定到手机上扫描二维码。二维码切换为已扫描等待确认,此时账户信息将与该ID绑定。当移动端确认登录后,会在PC端生成登录的token,返回给PC端。到这里,基本思路已经很清楚了。接下来,让我们把整个过程具体化。根据二维码的不同状态,二维码就可以查看了。首先是等待扫描状态。当用户打开PC,切换到二维码登录界面。PC向服务器发起请求,告诉服务器我要生成用户登录二维码,并将PC的设备信息传给服务器。服务端收到请求后生成二维码ID,发送二维码ID与PC设备信息绑定,然后将二维码ID返回给PC。QR码的状态。客户端显示二维码后,PC不断轮询服务器。好了,接下来就是切换扫描状态和扫描状态了。用户用手机扫描PC端二维码,通过二维码内容获取二维码ID,然后调用服务端API将移动端身份信息与二维码ID结合。一起发送到服务器。服务端收到后,可以将身份信息与二维码ID绑定,生成一个临时令牌。然后返回到移动端,因为PC端一直在轮询二维码的状态,所以此时当二维码的状态发生变化时,可以在界面上更新二维码的状态为已扫描,所以为啥需要返回移动端吗?临时令牌呢?临时令牌和token一样,也是一种身份凭证,不同的是只能使用一次,用完就失效了。第三步,返回临时令牌,以便移动终端在下一步中作为证书使用。这样就保证了扫码和登录这两个步骤是同一个手机发送的,状态确认最后就是状态确认。移动端收到临时令牌后,会弹出确认登录界面。当用户点击确认时,移动端携带临时token调用服务端接口,告诉服务端我已经确认,服务端收到确认。根据二维码ID绑定的设备信息和账号信息生成用户PC登录的token。这时PC端的轮询界面就会知道二维码的状态已经变为“已确认”。并且可以从服务器获取用户登录的token。到这里登录成功,后端PC可以使用token访问服务器的资源了。扫码的基本流程已经讲解完毕,有些细节就不深入介绍了。比如二维码的内容是什么?它可以是二维码ID。可以是包含二维码ID的url地址。在扫描确认这一步,用户取消了怎么办?这些细节留给大家去思考和总结。我们从登录的本质出发,探索如何通过扫描二维码登录。告诉系统我是谁,并向系统证明我是谁。在这个过程中我们首先简单的讲了两个前提知识,一个是二维码的原理,一个是基于token的认证机制。然后我们以二维码的状态为轴分析了这背后的逻辑:扫码登录是通过token认证机制和二维码的状态变化来实现的。需要指出的是,上述登录流程适用于同一系统的PC端、Web端和移动端。通常我们还有一个常见的场景,就是通过第三方应用扫码登录,那么这个第三方应用扫码登录的原理是什么呢?有兴趣的同学可以考虑一下。