基于 JWT 进行登录设计
基于 JWT 进行登录设计
自动续期和过期自动下线
设计通过 JWT(JSON Web Token) 进行身份验证时自动续签和过期自动下线,涉及以下几个关键部分:
一般会设计两个令牌:
- 访问令牌(Access Token):访问令牌通常有较短的有效期(例如 15 分钟到 1 小时)。这是用于实际请求身份验证的令牌。
- 刷新令牌(Refresh Token):刷新令牌的有效期可以相对较长(例如,几天或几周)。它允许在访问令牌过期后,重新获取新的访问令牌,而无需再次进行用户登录。如果刷新令牌本身过期,则需要重新登录。
自动续签机制
续签时机:当用户的访问令牌接近过期时(例如,剩余时间少于某个阈值,如 5 分钟),客户端应用会通过刷新令牌请求一个新的访问令牌。
刷新令牌的请求流程:
- 客户端检查访问令牌是否即将过期(例如,通过存储访问令牌的过期时间)。
- 如果接近过期,则向认证服务器发送 刷新令牌 请求。
- 认证服务器验证刷新令牌的有效性。如果有效,则返回新的访问令牌和刷新令牌。
- 客户端用新的访问令牌继续进行后续请求。
- 可选:刷新令牌本身也可以在一定时间后过期(例如,90 天后)。刷新令牌的过期可以通过存储在服务器端的黑名单来管理,确保不再使用过期的刷新令牌。
过期和自动下线
JWT 过期:JWT 通常包含 exp 字段,标识该令牌的过期时间。服务器在验证访问令牌时,检查 exp 字段。如果令牌过期,服务器会返回一个 401 Unauthorized 错误。
自动下线机制:如果用户未能在过期前续签访问令牌,或刷新令牌过期,则需要在客户端强制下线用户。
客户端接收到 401 错误时,应通知用户其登录已过期,并要求用户重新登录。
刷新令牌过期或者强制退出
强制退出:如果用户的刷新令牌过期或者刷新令牌被服务器撤销(例如:用户登出、密码更改等),则需要在服务器端处理用户的强制注销:
将用户的刷新令牌加入黑名单,防止继续使用。
发送通知,要求客户端重新登录。
客户端接收到强制退出的提示后,清除本地的 JWT 和刷新令牌。
安全性
刷新令牌的安全性:刷新令牌需要在 HTTP 请求中使用 HTTP-only cookie 或 加密存储,防止被 XSS 攻击窃取。
防止刷新令牌被滥用:
- 可以通过存储每个刷新令牌的使用记录(如在数据库中)来限制每个刷新令牌的使用次数,确保每次请求都能被正确验证。
- 可考虑将刷新令牌绑定到 IP 地址或者设备信息,这样可以避免令牌被盗用后在其他设备上使用。
刷新令牌黑名单:一旦用户退出或更改密码,应该将对应的刷新令牌加入黑名单,防止其在未授权的情况下继续使用。
完整的认证流程设计
- 用户登录:
- 用户提供凭证(如用户名和密码)到认证服务器。
- 认证服务器验证凭证有效后,生成一个访问令牌和一个刷新令牌,并返回给客户端。
- 客户端请求资源:
- 客户端将访问令牌附加在请求头(
Authorization: Bearer <AccessToken>
)中发送给服务器。 - 服务器验证访问令牌是否有效,如果有效,则允许访问资源。
- 客户端将访问令牌附加在请求头(
- 访问令牌即将过期:
- 客户端在本地保存访问令牌和其过期时间,当访问令牌快过期时(例如,提前 5 分钟),客户端自动向认证服务器发送刷新令牌请求。
- 认证服务器处理刷新令牌请求:
- 认证服务器验证刷新令牌的有效性。如果有效,则返回新的访问令牌和刷新令牌。
- 客户端替换旧的访问令牌和刷新令牌,继续正常访问资源。
- 访问令牌过期且无效刷新令牌:
- 如果访问令牌过期且刷新令牌无效(例如,刷新令牌也过期或被撤销),服务器返回一个 401 Unauthorized 错误,要求用户重新登录