当前位置: 首页 > 科技观察

面试官:如何实现扫码登录功能?

时间:2023-03-21 21:07:12 科技观察

真实面试场景:刻板印象和算法的交锋结束后,老三松了口气,屏住了呼吸。面试官微微一笑,“其实我真正想问的是……你觉得扫码登录应该怎么实现。”老三:“啊……这个,哦……那个,就这样,然后……呃……嗯……”面试官:“明白了,回去等通知吧。”完了……好了,铺垫完毕,进入我们今天的正题,如何实现扫码登录功能?扫码登录场景扫码登录场景想必大家都很熟悉——很多PC端网站都提供了扫码登录的功能,无需在网页上输入任何帐号和密码,只需通过APP上的扫码功能即可手机,如微信、淘宝、QQ等,扫描网页上的二维码,确认登录,即可完成网页登录。扫码登录QQ邮箱扫码登录解析我们来分析一下,扫码登录其实涉及三个角色,需要解决两个问题。这三个角色是显而易见的。扫码登录涉及的三个角色:PC、手机、服务器。与三个端子相关的设计必须围绕这三个端子进行。具体的设计其实是每个终端应该完成什么功能?应该如何实现?终端与终端应该如何交互?对于登录认证方式,我们面临两个问题:如何在移动端完成认证,如何在PC端完成登录。如果PC端再次请求服务器,则需要携带一个tokenkey来标识和证明自己的登录状态。服务端响应时,需要验证tokenkey,通过则正常响应;如果验证失败,则认证失败;或者token过期,PC需要重新登录认证获取新的tokenkey。帐号/密码登录流程改为扫码登录:认证不是通过帐号和密码,而是通过手机扫码。获取经过身份验证的凭据。扫码登录实现如何在移动端完成认证如何生成二维码如何生成二维码类似于超市的条码。二维码的内容比较自由,里面不仅可以存数字,还可以存任何字符串。我们可以认为它是文字的另一种表现形式。接下来,我通过一个网站将文字转为二维码:TexttoQRcode所以,我们用手机扫码的过程其实就是对二维码进行解码,获取二维码中包含的数据。那么如何生成二维码呢?首先我们PC端会显示二维码,所以要产生这个操作,PC端要请求服务器获取相应的数据,然后PC端生成二维码。QR码包含什么?QR码是我们场景中的重要媒介。服务器必须为这个数据生成一个唯一的标识作为二维码ID,还要设置一个过期时间。PC端根据二维码ID等数据生成二维码。在生成二维码的同时,服务端还需要保存二维码的一些状态:未扫描、成功、无效。APP认证机制我们还要了解基于APP的移动互联网认证机制。首先,移动端一般不存储登录密码。我们发现只有在加载APP并进行首次登录时,才需要根据账号密码进行登录。无需再次输入账号密码,即可自动登录。这背后是一套基于token的认证机制,与PC有些相似,又有些不同。APP登录鉴权APP登录鉴权时,除了账号密码外,还有设备信息账号密码验证通过,服务器会将账号与设备绑定持久化存储,包括账号ID、设备ID、设备类型等。每个APP请求不仅携带tokenkey,还需要携带设备信息。因为移动设备是唯一的,它可以为每个客户端生成一个专用的token,而且这个token是不需要过期的,所以这就是我们一次登录,可以长期使用的原则。手机扫码做了什么?现在很清楚了。我们的手机扫码做了两件事:扫描二维码:识别PC端显示的二维码,获取二维码ID扫描确认登录:手机端传递Authentication信息(tokenkey,设备信息)和二维码信息(二维码ID)请求服务器完成身份验证过程并确认在PC上登录。确认登录ps:手机扫一扫确认不是重点,这里就简化了。一种说法是在扫码时向服务器申请一个一次性的临时令牌,确认登录时携带这个临时令牌访问服务器。如何完成PC端的登录接下来就是我们的重头戏了。移动端完成工作后,我们如何进入服务器端的登录状态呢?前面我们说过,PC端使用token来标识登录状态。然后在手机端扫描确认后,我们的服务器应该为PC端生成对应的token。那么,PC端如何获取自己完成登录所需要的tokenkey呢?如何获取PCtokenPC端可以通过获取二维码的状态做出相应响应:未扫描二维码:未操作二维码无效:提示刷新二维码二维码已成功刷新:获取PCtoken从服务器获取二维码的状态。发送二维码状态查询请求。轮询长轮询长轮询是指客户端主动向服务器发送查询二维码状态的请求,服务器会根据情况阻塞请求,直到二维码信息更新或超时。客户端收到返回结果后,如果还没有扫描到二维码,则会继续发送查询请求,直到状态发生变化(无效或成功)。长轮询WebsocketWebsocket是指前端生成二维码后,会与后端建立连接。一旦后端发现二维码的状态发生了变化,就可以主动通过建立的连接直接向前端推送信息。Websocket总结通过前面的分析,我们已经知道了二维码扫描登录的一些关键点。下面我们就把这几点串起来来看一下二维码扫描登录的整体实现流程。以常用的轮询方式获取二维码状态为例:扫码登录访问PC端二维码生成页面,PC端请求服务器获取二维码ID,服务器生成对应的二维码ID,并设置二维码的有效期、状态等。PC获取二维码ID,生成对应的二维码。手机扫描二维码获取二维码ID。移动终端向服务器发送移动终端token和二维码ID,确认登录。服务器验证移动令牌,并根据移动令牌和二维码ID生成PC令牌。PC通过轮询的方式请求服务器,通过二维码ID获取二维码的状态。如果成功,它会返回PC令牌。登陆成功。好了,至此我们一个扫码登录功能的设计就完成了。由于博主对移动端的相关认证机制了解不多,如有错误或遗漏,请博主多多交流!参考文献:[1]。三种扫码登录方式:https://forthe77.github.io/2019/05/23/qrcode-scan-login/[2]。二维码扫描登录的原理是什么?:https://juejin.cn/post/6940976355097985032一个自称能文能武,技术水平和外貌相符的Java程序员。基础、实战、原理、访谈都在这里。关注我,我们一起进步!