spring - Spring Boot JWT - 如何实现刷新令牌和注销 REST-API
问题描述
我们决定从Basic-Auth切换到JWT,因为存储在内存中的 session-ids 有时会导致我们的 Spring-Boot 服务器崩溃,该服务器服务于Twitter等 Android 移动应用程序。
但是对于我们的移动用例,我们有一些关于JWT的问题:
- 访问令牌应该存在多长时间?
- 刷新令牌应该存在多长时间?
access-token
如何通过使用户和用户无效来注销用户refresh token
?(对于注销我们已经删除了移动应用端的令牌,但是如果令牌被某人窃取并且仍然有效怎么办?)
解决方案
我会尽力回答你的问题
How long should an access token live?
您可以轻松配置到期时间,这取决于您的要求。一般来说,尽量保持简短。
How long should the refresh token live?
以上适用于刷新令牌,条件是刷新令牌通常比访问令牌寿命更长,原因很明显。
How to logout a User by invalidating his access-token and refresh token?
这部分可能有点棘手。
您不能在创建令牌后手动使其过期。因此,您不能像使用会话那样在服务器端使用 JWT 注销。
可以实现一些选项,例如
- 当用户执行注销操作或被入侵时。有一个黑名单来存储无效令牌,直到它们的初始到期日期。您将需要为每个请求查找数据库,但存储应该更少,因为您将存储在注销和到期时间之间的令牌。您可以通过将黑名单保存在内存而不是数据库中来提高效率。
- 将客户端 IP 地址存储在声明对象 JWT 中。验证令牌时,您可以检查此客户端的 IP 地址是否相同。您可以根据需要对其进行细化,例如使用用户代理和客户端 IP。
- 最糟糕的是重置用户凭据或 JWT 令牌组件以生成一个新的,它会自动使所有现有的无效。
添加一些链接以获得更深入的细节
推荐阅读
- javascript - 理解 React 中的 [object object],将 1 个组件传递给另一个组件
- java - Selenium 3.141.59、Junit 4和Cucumber 6.10.2实现跨浏览器测试
- flutter - AnimatedOpacity 在 iniiState 中没有改变其状态 - Flutter
- python - 使用 bs4 和 Python 从网页中提取引号列表时遇到问题
- javascript - React async/await blob() - 无法在“URL”上执行“createObjectURL”
- swift - 如何在 ARKit 中停止实时跟踪图像并将 SCNNode 保留在场景中?
- android - 当我的球碰到篮筐时如何加分?如何判断球与篮的触感?
- javascript - 仅将一些字段解构为对象 A,并将其余字段解构为 B
- facebook - 我们可以使用 facebook API 抓取 facebook 用户喜欢的页面吗?
- amazon-web-services - 执行任意二进制文件时不允许操作