前端用户登陆状态认证方案

25 阅读3分钟

Docs

需求点分析

  • 登陆状态失效捕获
  • 登陆状态无感刷新
  • 支持多个网络请求重发

Token 认证方案分析

单 Token 方案

  1. 基础方案
  • 设置过期时间范围 Time
  • token 距离过期时间在 Time 时间范围内,就刷新过期时间。
  • 如果 token 确认已经过期就拒绝请求。

基础方案问题

  • 还是会出现用户在持续登录时出现 Token 失效问题
    • token 30分钟,Time 1分钟
    • 用户在 28分钟 操作触发一次网络请求
    • 然后接着操作APP,用户在31分钟 操作触发一次网络请求,但是实际已经过期了。
  • 可能多个网络请求同时触发服务端 Token 刷新处理

    后端可以对 Token 做状态标记处理,如果 Token 确认失效需要加上状态标记,那么进行刷新 Token 步骤时,通过状态拒绝当前用户(相同 Token )其他的请求。

  1. 修改方案: 取消 Time ,每次接口请求都刷新 Token 过期时间。但是依旧会触发 Token 失效,因为有可能间隔操作超过一个 Token 时间。
  2. 修改方案: 延长 token 时间 为 1 天。但是存在 Token 滥用安全问题,前端已经无法控制,后端需要有足够的异常访问风险识别能力。

双 token 方案

基于 OAuth2 的 access tokens(访问令牌)、refresh tokens(刷新令牌) + JWT 的方案

基础概念

  • access tokens
    • access tokens 的生命周期相对较短,比如 30 分钟。
    • access tokens 是客户端用于向资源服务器发出请求的字符串标识。
  • refresh tokens
    • refresh tokens 的生命周期相对较长,比如 3 天。
    • refresh tokens 的存在是为了使授权服务器能够使用 refresh tokens 的短生命周期,而无需在 token 过期时让用户参与。
  • tokens
    • 令牌不限制任何特定格式,比如字符串、JWT。
  1. 基础方案
  • 客户端发起登陆认证请求,服务端下发 access token 和 refresh token。
  • 客户端将 refresh token 和 access token 保存。后续请求中如果 请求头都会带上 access token。
  • 如果服务端报错 access token 过期。客户端请求刷新 access token,refresh token 作为请求内容。
  • 服务端收到刷新请求,返回新的 refresh token 和 access token。

基础方案问题

  • 假如有多个请求,那么如何更新请求头加入新的 access token,以及进行按发起顺序做重发处理。

封装实例

总结

  • 网页端 H5 不建议双 Token 方案,单 Token 机制就够用,只是部分用户体验稍差。因为网页端保存 refresh token 数据到本地 Storage 有一定安全风险。
  • 客户端 App 可以使用双 Token 方案。因为客户端的缓存保存 refresh token 安全风险相对较小。

原创转载 brownant.top/docs/review…