当前位置: 首页 > 网络应用技术

Java语言实施

时间:2023-03-08 10:12:43 网络应用技术

  我相信每个人都不对QR码不熟悉,并且生活中扫描代码的场景充满了扫描代码,例如登录Web版本的Wechat,apay等。代码登录,我感到非常有趣,因此我意识到了一个简单的演示登录版本来记录学习过程。

  实际上,在采访中被问到我。

  1.身份身份验证机制

  在介绍扫描代码登录的原理之前,让我们谈谈服务器的身份身份验证机制。将普通登录方法作为示例,在收到用户的登录请求后,服务器首先验证帐户和密码的合法性。如果验证验证已批准,服务器将为用户分配令牌。令牌与用户的身份信息相关联,可以用作用户登录证书。再次发送PC后,您需要在请求的标题或查询参数中带上令牌。服务器可以基于令牌识别当前用户。令牌的优点是它更方便和安全。它降低了被劫持帐户密码的风险,用户无需重复输入帐户和密码。通过帐户和密码在PC侧登录的过程如下:

  代码登录本质上是一种身份认证的一种方式。登录和代码登录之间的区别在于,前者使用PC的帐号和密码申请了PC端的令牌,而后者使用PC申请令牌。这两个登录方法的目的是启用PC在服务器上获取“授权”。在申请PC端的令牌之前,两者都需要证明其对服务器的身份,也就是说,服务器必须知道当前侧知道当前当前的用户,以便服务器可以为其生成PC令牌。必须在代码扫描之前登录手机,手机本身已保存一个令牌,该令牌可用于服务器的身份识别。那么,为什么在验证身份时,手机仍需要设备信息?,手机的身份身份验证与PC端略有不同:

  成功登录PC结束后,我们通常可以在短时间内浏览网络,但是访问网站时必须登录。这是因为代币有一个到期时间。但是,手机上似乎很少有问题。例如,即使我们关闭微信或重新启动手机,也可以一直使用它。这是因为设备信息是唯一的。即使将令牌被劫持,因为设备信息是不同的,攻击者也无法证明他的身份。这大大提高了安全系数,因此可以长时间使用令牌。手机通过帐户密码登录的过程如下:

  2.流程概述

  了解服务器身份验证机制后,让我们谈谈扫描代码的整个过程。以Wechat的Web版本为例。在两个维度代码登录上的PC -CLICK之后,浏览器页面将弹出QR码图片。此时,手机微信扫描QR码。单击以确认登录后,PC将显示“成功的登录”。

  在上述过程中,服务器可以根据手机的操作对PC侧响应。那么服务器如何连接两者?答案是通过“ QR码”的,它严格通过QR代码的内容。使用QR代码解码器来扫描微信的微信版的QR码,它可以获得以下内容:

  从上图,我们了解到QR码包含一个URL。手机扫描QR码后,请求将根据URL发送到服务器。然后,我们打开PC浏览器的开发人员工具:

  可以看出,在显示QR码后,PC侧没有“空闲”。它通过旋转不断将请求发送到服务器以了解手机操作的结果。在这里,我们注意到PC终端发送的URL中有一个参数UUID。该值为“ adv-np1fyw ==”,并且在QR代码中包含的URL中也存在UUID。从此我们可以推断,在生成QR代码之前,我们可以推断服务器将形成QR代码ID。两个维度代码ID和QR码的状态将被串在一起并一起存储在服务器上。手机可以根据QR代码ID操作服务方面操作两个维度代码,并且PC端可以询问根据QR代码ID的服务侧状态。

  这两个维度最初是“扫描”的。手机扫描代码后,服务器将其状态更改为“待确认”。此时,PC的旋转请求到达,服务器返回“要被确认”到它。手机确认登录后,QR码变为“已确认”状态。该服务器为PC的身份身份验证生成令牌。当再次询问PC时,您可以获取此令牌。扫描代码登录的整个过程如下:

  在上述过程中,我们注意到在扫描手机上的代码后,服务器将返回一个时间令牌。令牌也是身份证书,但只能使用一次。一个时间令牌的作用是确保由同一手机发出“代码扫描请求”和“确认登录”请求,即,手机用户无法“帮助其他用户确认登录”。

  我对一个时间的代币知识并不了解,但是可以推测,在服务器的缓存中,一个时间令牌的值映射应包括QR码信息,设备信息和用户信息“代码扫描”请求。

  1.环境准备

  2.主要依赖性

  3.生成QR代码

  QR码的生产和QR码状态的保存逻辑如下:

  当PC采访“登录”请求时,服务器调用CreateQrimg方法来生成UUID和LogInticket对象。LogInticket对象封装了用户的用户ID和QR代码状态。然后服务器将UUID用作键,并且LogInticket对象将其存储在Redis服务器中,作为值,有效时间为5分钟(QR代码的有效时间)(QR代码的有效时间)。CreateQrimg方法的逻辑如下:

  我们在上一节中提到,手机的操作主要影响QR码的状态。查询PC时,它也是QR码的状态。那么,为什么用户ID应该封装在LogInticket对象中?这是将QR码与用户关联。想象一下,我们在Web版本上登录到微信的微信场景。在手机上扫描代码后,PC将显示用户的头像。尽管没有确认手机登录,但PC终端轮将询问,但已获得扫描代码的用户(仅获得AVATAR信息)。因此,在手机上扫描代码后,您需要绑定QR与用户代码。使用loginticket对象作为实现。生成了QR码后,我们将其视为“要扫描”。UserId不会处理它,默认值为null。

  4.扫描QR码

  当在手机上发送“代码”请求时,查询参数随UUID携带。收到请求后,将调用服务端,并调用Scanqrcodeimg方法。服务器返回“代码成功”或“ QR代码失败”的信息到手机:

  Scanqrcodeimg方法的主要逻辑如下:

  在上面的代码中,当修改QR码的状态时,我们唤醒条件下障碍的线程。此步骤的目的是实现长轮的查询操作。以下将介绍长时间查询的设计思想。

  5.确认登录

  当在手机上发送“确认登录”请求时,查询参数随UUID携带,并且标头带有一个时间令牌。收到请求后,服务终端首先验证一个时间令牌的有效性,即检查与一次性uuiden One相对应的UUID。查询参数中的UUID是否相同,以确保代码扫描操作和确认操作来自相同的手机,可以在拦截器中配置。通过验证,服务器调用确认量表方法,QR码的状态设置为“确认”:

  确认方法的主要逻辑如下:

  此方法将检查QR码是否根据UUID代码过期。如果未过期,则修改了QR码的状态。

  6. PC-侧旋转查询

  旋转操作意味着前端反复向后端发送相同的请求以了解数据的变化。旋转查询分为长旋转和短轮查询:

  由于与短轮查询相比,长期的询问可以得到真正的时间响应并节省资源,因此我们考虑使用Reentrantlock在项目中实现长轮询问。旋转的目的是检查检查状态的变化QR码:

  GETQRCODESTATUS方法的主要逻辑如下:

  该方法接收两个参数,即UUID和CurrentStatus。UUID用于查询QR码。CurrentStatus用于确认QR代码状态是否已更改。如果是这样,则需要给您PC的反馈。我们规定,当PC查询时,QR码的当前状态需要在请求参数中携带。

  上面代码中的锁定操作是将当前处理的请求线程启用到阻止状态。当QR码的状态更改时,我们将其唤醒。因此,将是唤醒线程的过程。

  实际上,锁定操作是不合理的,因为我们仅设置锁定。因此,不同QR码的查询或修改操作将抓住相同的锁定。从理论上讲,不同的QR码的操作应独立。即使锁定锁定,也应该为每个QR码配备锁定,但是此代码将更加复杂。可能还有其他更好的选择。如何实现长期查询?或简单地在短回合中进行查询。当然,长时间的连接也可以用于使用Websocket。

  7.拦截器配置

  项目中配置了两个拦截器。一种用于确认用户的身份,即验证令牌是否有效:

  如果令牌有效,服务器将根据令牌获取用户的信息,并将用户信息存储到ThreadLocal容器中。移动电话和PC侧的请求由Interceptor处理,例如“查询用户的信息”请求,请求PC侧以及移动端上的“代码扫描”请求。由于我们忽略了手机验证所需的设备信息,因此PC和手机令牌可以使用相同的验证逻辑。

  另一个拦截器用于拦截“确认登录”请求,也就是说,验证一个时间令牌是否有效:

  拦截器主要拦截“确认登录”请求。应该注意的是,必须在通过后立即删除一个时间的令牌验证。

  在编码过程中,我们简化了许多操作,例如:1。忽略手机侧的设备信息;2.手机确认它在登录后没有直接为用户生成PC令牌,而是在旋转过程中生成。

  1.工具准备

  2.数据准备

  由于我们没有实现真实的手机扫描功能,因此我们使用Postman模仿手机将请求发送到服务器。首先,我们需要确保服务器存储用户的信息,即以下代码在测试类中执行:

  在手机上发送请求时,您需要带上手机令牌。在这里,我们为“ 1”的用户生成一个令牌(手机令牌):

  手机令牌(AccessStokeen)是“ AAE4666837D0246D486F64A3BCFAA9E1”(随机值),然后在发送“代码扫描”请求时需要带这个令牌。

  3.扫描代码登录过程显示

  启动项目,访问:

  单击以登录并在开发人员工具中找到QR代码ID(UUID):

  打开邮递员,发送请求,在查询参数中携带UUID,并在标题中携带手机令牌:

  上面的请求返回“代码成功”的响应,并且还返回一个时间 - token。这次,PC显示了代码扫描用户的头像:

  在Postman中发送请求,在查询参数中携带UUID,然后在标题中携带一次性令牌:

  “确认登录”请求完成后,PC终端获取PC令牌并成功查询用户信息:

  结论

  本文主要介绍扫描代码登录的原理,并实现了一个简单的演示登录版本。对原理部分和代码中的缺点的了解,欢迎您批评校正(⌒.-),请参阅源代码。为了扫描代码登录,如果您觉得收获收成,请给星星?。

  QR代码扫描代码登录的原理是什么

  谈论两个维度代码扫描登录原理+

  原始:https://juejin.cn/post/7096053627613085733