基于 JWT 进行登录设计

基于 JWT 进行登录设计

自动续期和过期自动下线

设计通过 JWT(JSON Web Token) 进行身份验证时自动续签和过期自动下线,涉及以下几个关键部分:
一般会设计两个令牌:

自动续签机制

续签时机:当用户的访问令牌接近过期时(例如,剩余时间少于某个阈值,如 5 分钟),客户端应用会通过刷新令牌请求一个新的访问令牌。
刷新令牌的请求流程:

  1. 客户端检查访问令牌是否即将过期(例如,通过存储访问令牌的过期时间)。
  2. 如果接近过期,则向认证服务器发送 刷新令牌 请求。
  3. 认证服务器验证刷新令牌的有效性。如果有效,则返回新的访问令牌和刷新令牌。
  4. 客户端用新的访问令牌继续进行后续请求。
  5. 可选:刷新令牌本身也可以在一定时间后过期(例如,90 天后)。刷新令牌的过期可以通过存储在服务器端的黑名单来管理,确保不再使用过期的刷新令牌。

过期和自动下线

JWT 过期:JWT 通常包含 exp 字段,标识该令牌的过期时间。服务器在验证访问令牌时,检查 exp 字段。如果令牌过期,服务器会返回一个 401 Unauthorized 错误。
自动下线机制:如果用户未能在过期前续签访问令牌,或刷新令牌过期,则需要在客户端强制下线用户。
客户端接收到 401 错误时,应通知用户其登录已过期,并要求用户重新登录。

刷新令牌过期或者强制退出

强制退出:如果用户的刷新令牌过期或者刷新令牌被服务器撤销(例如:用户登出、密码更改等),则需要在服务器端处理用户的强制注销:
将用户的刷新令牌加入黑名单,防止继续使用。
发送通知,要求客户端重新登录。
客户端接收到强制退出的提示后,清除本地的 JWT 和刷新令牌。

安全性

刷新令牌的安全性:刷新令牌需要在 HTTP 请求中使用 HTTP-only cookie 或 加密存储,防止被 XSS 攻击窃取。
防止刷新令牌被滥用:

完整的认证流程设计

  1. 用户登录:
    • 用户提供凭证(如用户名和密码)到认证服务器。
    • 认证服务器验证凭证有效后,生成一个访问令牌和一个刷新令牌,并返回给客户端
  2. 客户端请求资源:
    • 客户端将访问令牌附加在请求头(Authorization: Bearer <AccessToken>)中发送给服务器。
    • 服务器验证访问令牌是否有效,如果有效,则允许访问资源。
  3. 访问令牌即将过期:
    • 客户端在本地保存访问令牌和其过期时间,当访问令牌快过期时(例如,提前 5 分钟),客户端自动向认证服务器发送刷新令牌请求。
  4. 认证服务器处理刷新令牌请求:
    • 认证服务器验证刷新令牌的有效性。如果有效,则返回新的访问令牌和刷新令牌。
    • 客户端替换旧的访问令牌和刷新令牌,继续正常访问资源。
  5. 访问令牌过期且无效刷新令牌:
    • 如果访问令牌过期且刷新令牌无效(例如,刷新令牌也过期或被撤销),服务器返回一个 401 Unauthorized 错误,要求用户重新登录