持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
登录流程是一个比较常见的面试题,但是为什么会有这种面试题呢?它考察的点是什么?能面试出什么样的结果和筛选出什么样的面试者?
登录流程
先不说问题,直接解题,我们来看看登录流程是怎么样的。
简单的登录流程
- 用户输入用户名和密码
- 前端将用户名和密码发送给后端
- 后端验证用户名和密码
- 后端将验证结果返回给前端
- 前端根据后端返回的结果进行相应的处理
- 成功则跳转到首页,失败则提示错误信息
这是一个最简单的登录流程,它的核心是前后端交互,我们再将这个过程进阶一下。
稍微复杂的登录流程
- 用户输入用户名和密码
- 前端将用户名和密码发送给后端
- 后端验证用户名和密码
- 验证成功,生成 token 并将 token 返回给前端(不限制于 token 或者其他的方式都行,后端需要记录用户登录状态)
- 验证失败,返回错误信息给前端
- 前端根据后端返回的结果进行相应的处理
- 验证成功,将 token 保存在本地(不限制存储方式,前端需要记录用户登录状态),跳转到首页
- 验证失败,提示错误信息
上面的这个过程是稍微复杂一点的登录流程,它的核心是前端或者后端对用户登录状态的验证和记录,这里已经开始区分到前端和后端的职责了。
上面的过程能否再进阶一下呢?
进阶的登录流程
- 前端先调用接口获取验证码
- 用户输入用户名、密码和验证码
- 前端将用户名、密码和验证码发送给后端
- 后端验证用户名、密码和验证码
- 刷新验证码
- 验证码验证
- 用户名和密码验证,记录用户登录状态
- 返回验证结果
- 前端根据后端返回的结果进行相应的处理
- 验证失败,进行失败的处理,弹出错误信息,重新获取验证码
- 验证成功,进行成功的处理,跳转、保存 token 等
这个过程是一个进阶的登录流程,它的核心是验证码的验证,已经涉及到安全问题了。
还能不能更复杂一点呢?
更复杂的登录流程
- 前端先调用接口获取验证码
- 用户输入用户名、密码和验证码
- 前端将用户名、密码和验证码发送给后端
- 后端验证用户名、密码和验证码
- 刷新验证码
- 验证码验证
- 用户名和密码验证,记录用户登录状态
- 返回验证结果
- 前端根据后端返回的结果进行相应的处理
- 验证失败,进行失败的处理,弹出错误信息,重新获取验证码
- 验证成功,进行成功的处理,跳转、保存 token 等
- 用户访问其他页面
- 前端验证用户登录状态
- 验证成功,进行成功的处理,跳转
- 验证失败,进行失败的处理,跳转到登录页面
上面的这个过程主要是用户登录后,访问其他页面时的验证,这里涉及的主要是前端的验证。
还能更复杂一点。
更复杂的登录流程+1
- 前端先调用接口获取验证码
- 用户输入用户名、密码和验证码
- 前端将用户名、密码和验证码发送给后端
- 后端验证用户名、密码和验证码
- 刷新验证码
- 验证码验证
- 用户名和密码验证,记录用户登录状态
- 返回验证结果
- 前端根据后端返回的结果进行相应的处理
- 验证失败,进行失败的处理,弹出错误信息,重新获取验证码
- 验证成功,进行成功的处理,跳转、保存 token 等
- 用户访问其他页面
- 前端验证用户登录状态
- 验证成功,进行成功的处理,跳转
- 验证失败,进行失败的处理,跳转到登录页面
- 跳转新页面成功调用接口
- 携带 token
- 发送请求
- 后端验证 token
- 验证成功,调用对应的接口,返回数据
- 验证失败,返回错误信息
- 前端根据后端返回的结果进行相应的处理
- 验证失败,进行失败的处理(根据不同类型的错误信息进行处理)
- 验证成功,进行成功的处理,渲染页面
上面的这个过程主要是用户登录后,访问其他页面时的验证,这里主要涉及的是前后端协作的过程。
更复杂的登录流程+2
- 前端先调用接口获取验证码
- 用户输入用户名、密码和验证码
- 前端将用户名、密码和验证码发送给后端
- 后端验证用户名、密码和验证码
- 刷新验证码
- 验证码验证
- 用户名和密码验证,记录用户登录状态
- 返回验证结果(可以在这里返回权限信息)
- 前端根据后端返回的结果进行相应的处理
- 验证失败,进行失败的处理,弹出错误信息,重新获取验证码
- 验证成功,进行成功的处理,跳转、保存 token 等
- 获取权限信息,根据权限信息进行页面的渲染
- 用户访问其他页面
- 验证用户是否有权限访问该页面
- 前端验证用户登录状态
- 验证成功,进行成功的处理,跳转
- 验证失败,进行失败的处理,跳转到登录页面
- 跳转成功调用接口
- 携带 token
- 发送请求
- 后端验证 token
- 验证当前登录用户是否有权限访问该接口
- 验证成功,调用对应的接口,返回数据
- 验证失败,返回错误信息
- 前端根据后端返回的结果进行相应的处理
- 验证失败,进行失败的处理(根据不同类型的错误信息进行处理)
- 验证成功,进行成功的处理,渲染页面
- 页面中是否有更复杂的权限验证,根据后端返回的权限信息进行相应的处理
上面的这个过程主要是用户登录后,访问其他页面时的验证,这里主要涉及的是权限的处理。
目前的登录流程已经比较完善了,但是还有一些问题,当然肯定还会有其他的问题,例如单点登录、登录状态的保持等等,这些是需要专精登录流程的人去处理的,这里就不再赘述了。
考察点
上面列举了这么多的登录流程,涉及到前端、后端,涉及到安全、权限处理等等。
如果我是一个面试者,先说一下我会怎么回答这个问题。
个人作为面试者的回答(前端)
用户在输入用户名和密码后,会将用户名和密码发送给后端,后端这边进行处理验证返回结果,如果失败,会返回对应的错误信息,例如用户不存在,密码错误等,这些需要提示给用户。
如果成功会返回一个 token,先将这个 token 保存下来,不管保存在什么地方(session、local 等)。
如果系统设计中有权限的话,就获取权限信息,根据权限信息进行页面的渲染,至此,登录流程就结束了。
个人作为面试者的回答(后端)
前端将用户名和密码发送给我,我这边进行处理验证,如果失败,会返回对应的错误信息,例如用户不存在,密码错误等,这些需要提示给用户。
如果系统设计中有验证码这个环节,就需要验证验证码是否正确,如果不正确,返回错误信息,如果正确,就进行下一步,验证码每次验证之后都需要重新生成。
如果用户名和密码验证成功,会返回一个 token,这个 token 根据一定的规则生成,例如用户名、密码、时间戳等,这个 token 会保存在数据库中(或者其他的什么地方),同时返回给前端,至此,登录流程就结束了。
很明显上面的回答都是不够完善的,同时如果你是面试官,是否可以对上面的回答进行追问?还有对于上面的回答你是否能看出一个面试者的水平?
如果你是面试官,你会怎么问?如果你是面试者,你会怎么回答?
个人作为面试官的追问(前端)
- 你这边的 token 是怎么保存的?后续可以追问每种存储方式的区别和雷点怎么处理。
- 权限处理是怎么处理的?后续可以追问权限处理的细节,例如权限验证的时机、权限验证的方式、权限验证的规则等等。
个人作为面试官的追问(后端)
- 你这边的 token 是怎么生成的?后续可以追问 token 生成的细节,例如 token 生成的规则、token 生成的方式等等。
- token 是怎么保存的?后续可以追问每种存储方式的区别和雷点怎么处理。
- token 的有效期怎么处理?后续可以追问 token 的过期怎么处理等等。
- token 的安全性怎么处理?后续可以追问 token 的安全性的细节,例如 token 的泄露怎么处理等等。
- 还有验证码的问题,验证码的生成和验证怎么处理?后续可以追问验证码的细节,例如验证码的生成规则、验证码的验证规则等等。
个人只能想到上面这些问题,如果你有更好的问题,欢迎在下面留言。
个人总结
所以登录流程考察点是什么?我在面试的时候,被面试官问到这个问题很莫名其妙,问完了也没有什么追问,所以突然就想到这个问题了,可能是我就是走个流程吧。
但是当我梳理了一下过程之后,发现可以考察的点还是挺多的,所以我就想到了写这篇文章,希望能帮助到大家。
当然我这里并没有总结太多的知识点,因为是个人的理解,可能有些地方理解的不够深刻,如果有什么问题,欢迎在下面留下评论,如果有好的知识面我可以更新上去。