本人菜鸟,目前在开发几个 RESTFul API 。现在遇见一个头疼的问题,希望大家不吝指教:
如何能保证一个用户在一段时间内只能有一个 Token 是可用的?
---- 用户在某一个时刻只能有一个有效 Token ,即,用户已有一个有效 Token 时,再次请求 Token 时要作废之前生成的那个 Token 。
实际的业务流程是:
- 需要调用者先使用
用户名和密码去签定身份 - 鉴定成功,服务器返回一个 Token
- 调用者之后再调用其他 API 时就在 HTTP
AuthorizationHeader 中带着这个 Token
目前采用的方案是:
- 使用 jjwt 生成 Token ,保存在 Redis 中,以用户名作为 Key
- 通过设置 Redis 键的 TTL 来实现 Token 自动过期
- 通过在 Servlet Filter 中拦截请求判断 Token 是否有效
- 由于 Redis 是基于 Key-Value 进行存储,因此可以实现新的 Token 将覆盖旧的 Token ,保证一个用户在一个时间段只有一个可用 Token
问题和纠结是:
- 查阅了好多资料都提到 RESTFul API 通常被设计成无状态的,采用 JWT ( Json Web Token )进行认证是不需要将生成的 Token 保存在 Session 中的,那现在我的方案明显就是相悖的。
- 在我现在的方案中,如果用户担心旧的 Token 已经被泄漏,可以重新生成一个 Token ,那么旧的 Token 就会过期,这是很好的结果。但是如果用户写好的某个调用程序正在执行,不小心又重新生成了一个 Token ,那么调用就会停止。如何避免这种情况?