为什么会有登录流程这种面试题?

518 阅读10分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

登录流程是一个比较常见的面试题,但是为什么会有这种面试题呢?它考察的点是什么?能面试出什么样的结果和筛选出什么样的面试者?

登录流程

先不说问题,直接解题,我们来看看登录流程是怎么样的。

简单的登录流程

  1. 用户输入用户名和密码
  2. 前端将用户名和密码发送给后端
  3. 后端验证用户名和密码
  4. 后端将验证结果返回给前端
  5. 前端根据后端返回的结果进行相应的处理
  6. 成功则跳转到首页,失败则提示错误信息

这是一个最简单的登录流程,它的核心是前后端交互,我们再将这个过程进阶一下。

稍微复杂的登录流程

  1. 用户输入用户名和密码
  2. 前端将用户名和密码发送给后端
  3. 后端验证用户名和密码
    • 验证成功,生成 token 并将 token 返回给前端(不限制于 token 或者其他的方式都行,后端需要记录用户登录状态)
    • 验证失败,返回错误信息给前端
  4. 前端根据后端返回的结果进行相应的处理
    • 验证成功,将 token 保存在本地(不限制存储方式,前端需要记录用户登录状态),跳转到首页
    • 验证失败,提示错误信息

上面的这个过程是稍微复杂一点的登录流程,它的核心是前端或者后端对用户登录状态的验证和记录,这里已经开始区分到前端和后端的职责了。

上面的过程能否再进阶一下呢?

进阶的登录流程

  1. 前端先调用接口获取验证码
  2. 用户输入用户名、密码和验证码
  3. 前端将用户名、密码和验证码发送给后端
  4. 后端验证用户名、密码和验证码
    • 刷新验证码
    • 验证码验证
    • 用户名和密码验证,记录用户登录状态
    • 返回验证结果
  5. 前端根据后端返回的结果进行相应的处理
    • 验证失败,进行失败的处理,弹出错误信息,重新获取验证码
    • 验证成功,进行成功的处理,跳转、保存 token 等

这个过程是一个进阶的登录流程,它的核心是验证码的验证,已经涉及到安全问题了。

还能不能更复杂一点呢?

更复杂的登录流程

  1. 前端先调用接口获取验证码
  2. 用户输入用户名、密码和验证码
  3. 前端将用户名、密码和验证码发送给后端
  4. 后端验证用户名、密码和验证码
    • 刷新验证码
    • 验证码验证
    • 用户名和密码验证,记录用户登录状态
    • 返回验证结果
  5. 前端根据后端返回的结果进行相应的处理
    • 验证失败,进行失败的处理,弹出错误信息,重新获取验证码
    • 验证成功,进行成功的处理,跳转、保存 token 等
  6. 用户访问其他页面
  7. 前端验证用户登录状态
    • 验证成功,进行成功的处理,跳转
    • 验证失败,进行失败的处理,跳转到登录页面

上面的这个过程主要是用户登录后,访问其他页面时的验证,这里涉及的主要是前端的验证。

还能更复杂一点。

更复杂的登录流程+1

  1. 前端先调用接口获取验证码
  2. 用户输入用户名、密码和验证码
  3. 前端将用户名、密码和验证码发送给后端
  4. 后端验证用户名、密码和验证码
    • 刷新验证码
    • 验证码验证
    • 用户名和密码验证,记录用户登录状态
    • 返回验证结果
  5. 前端根据后端返回的结果进行相应的处理
    • 验证失败,进行失败的处理,弹出错误信息,重新获取验证码
    • 验证成功,进行成功的处理,跳转、保存 token 等
  6. 用户访问其他页面
  7. 前端验证用户登录状态
    • 验证成功,进行成功的处理,跳转
    • 验证失败,进行失败的处理,跳转到登录页面
  8. 跳转新页面成功调用接口
    • 携带 token
    • 发送请求
  9. 后端验证 token
    • 验证成功,调用对应的接口,返回数据
    • 验证失败,返回错误信息
  10. 前端根据后端返回的结果进行相应的处理
    • 验证失败,进行失败的处理(根据不同类型的错误信息进行处理)
    • 验证成功,进行成功的处理,渲染页面

上面的这个过程主要是用户登录后,访问其他页面时的验证,这里主要涉及的是前后端协作的过程。

更复杂的登录流程+2

  1. 前端先调用接口获取验证码
  2. 用户输入用户名、密码和验证码
  3. 前端将用户名、密码和验证码发送给后端
  4. 后端验证用户名、密码和验证码
    • 刷新验证码
    • 验证码验证
    • 用户名和密码验证,记录用户登录状态
    • 返回验证结果(可以在这里返回权限信息
  5. 前端根据后端返回的结果进行相应的处理
    • 验证失败,进行失败的处理,弹出错误信息,重新获取验证码
    • 验证成功,进行成功的处理,跳转、保存 token 等
    • 获取权限信息,根据权限信息进行页面的渲染
  6. 用户访问其他页面
    • 验证用户是否有权限访问该页面
  7. 前端验证用户登录状态
    • 验证成功,进行成功的处理,跳转
    • 验证失败,进行失败的处理,跳转到登录页面
  8. 跳转成功调用接口
    • 携带 token
    • 发送请求
  9. 后端验证 token
    • 验证当前登录用户是否有权限访问该接口
    • 验证成功,调用对应的接口,返回数据
    • 验证失败,返回错误信息
  10. 前端根据后端返回的结果进行相应的处理
  • 验证失败,进行失败的处理(根据不同类型的错误信息进行处理)
  • 验证成功,进行成功的处理,渲染页面
  • 页面中是否有更复杂的权限验证,根据后端返回的权限信息进行相应的处理

上面的这个过程主要是用户登录后,访问其他页面时的验证,这里主要涉及的是权限的处理。

目前的登录流程已经比较完善了,但是还有一些问题,当然肯定还会有其他的问题,例如单点登录、登录状态的保持等等,这些是需要专精登录流程的人去处理的,这里就不再赘述了。

考察点

上面列举了这么多的登录流程,涉及到前端、后端,涉及到安全、权限处理等等。

如果我是一个面试者,先说一下我会怎么回答这个问题。

个人作为面试者的回答(前端)

用户在输入用户名和密码后,会将用户名和密码发送给后端,后端这边进行处理验证返回结果,如果失败,会返回对应的错误信息,例如用户不存在,密码错误等,这些需要提示给用户。

如果成功会返回一个 token,先将这个 token 保存下来,不管保存在什么地方(session、local 等)。

如果系统设计中有权限的话,就获取权限信息,根据权限信息进行页面的渲染,至此,登录流程就结束了。

个人作为面试者的回答(后端)

前端将用户名和密码发送给我,我这边进行处理验证,如果失败,会返回对应的错误信息,例如用户不存在,密码错误等,这些需要提示给用户。

如果系统设计中有验证码这个环节,就需要验证验证码是否正确,如果不正确,返回错误信息,如果正确,就进行下一步,验证码每次验证之后都需要重新生成。

如果用户名和密码验证成功,会返回一个 token,这个 token 根据一定的规则生成,例如用户名、密码、时间戳等,这个 token 会保存在数据库中(或者其他的什么地方),同时返回给前端,至此,登录流程就结束了。


很明显上面的回答都是不够完善的,同时如果你是面试官,是否可以对上面的回答进行追问?还有对于上面的回答你是否能看出一个面试者的水平?

如果你是面试官,你会怎么问?如果你是面试者,你会怎么回答?

个人作为面试官的追问(前端)

  1. 你这边的 token 是怎么保存的?后续可以追问每种存储方式的区别和雷点怎么处理。
  2. 权限处理是怎么处理的?后续可以追问权限处理的细节,例如权限验证的时机、权限验证的方式、权限验证的规则等等。

个人作为面试官的追问(后端)

  1. 你这边的 token 是怎么生成的?后续可以追问 token 生成的细节,例如 token 生成的规则、token 生成的方式等等。
  2. token 是怎么保存的?后续可以追问每种存储方式的区别和雷点怎么处理。
  3. token 的有效期怎么处理?后续可以追问 token 的过期怎么处理等等。
  4. token 的安全性怎么处理?后续可以追问 token 的安全性的细节,例如 token 的泄露怎么处理等等。
  5. 还有验证码的问题,验证码的生成和验证怎么处理?后续可以追问验证码的细节,例如验证码的生成规则、验证码的验证规则等等。

个人只能想到上面这些问题,如果你有更好的问题,欢迎在下面留言。

个人总结

所以登录流程考察点是什么?我在面试的时候,被面试官问到这个问题很莫名其妙,问完了也没有什么追问,所以突然就想到这个问题了,可能是我就是走个流程吧。

但是当我梳理了一下过程之后,发现可以考察的点还是挺多的,所以我就想到了写这篇文章,希望能帮助到大家。

当然我这里并没有总结太多的知识点,因为是个人的理解,可能有些地方理解的不够深刻,如果有什么问题,欢迎在下面留下评论,如果有好的知识面我可以更新上去。