我目前正在开发一个具有多个Quarkus服务和Keycloft RBAC的PoC。工作起来很有魅力,很容易引导并开始实现功能。
但我遇到了一个我无法在脑海中解决的问题。想象一下:
- 用户访问受保护的服务
quarkus-oidc
扩展通过HTTP重定向实现花式代币获取,cookie中的JWT持续30分钟- 用户已通过身份验证并返回到web应用程序
- 用户在应用程序中工作,填写表格和数据
- 数据由JWT丰富的REST调用存储(我们通过
hibernate-validator
进行验证( - 用户再次工作,耗时超过30分钟
- 想要存储另一个条目,但步骤3中的令牌现在已过期,API调用失败
- 用户不会高兴,所以我也不会
可能的解决方法:
- 使JWT的持续时间超过当前的30分钟,但这只是推迟了问题并打开了一些安全门
- 将用户的输入存储在本地存储中,以便稍后在令牌刷新后恢复(我们也会这样做,以避免丢失用户的工作(
- 在用户不知情的情况下"静默"刷新JS中的令牌。有最佳实践吗
- 我错过了一些重要的东西,现在互联网告诉我的应用程序有一个更好的架构
感谢互联网!
关于步骤3。在Quarkus 1.5.0中,如果刷新授权成功,添加quarkus.oidc.token.refresh-expired=true
将刷新ID令牌并延长用户会话
对于此类用例,我倾向于使用JWT的相反版本。我将用户数据保存在共享数据服务(像Infinispan或Redis这样的数据网格(中。以便这些数据由用户键入并可用。我确实控制共享数据服务中该数据的TTL。
它可以是特定于应用程序的,也可以在少数应用程序之间共享。它确实带来了一些耦合,但JWT属性结构也是如此。
对于Quarkus,有一个Infinispan客户端集成,一个Hazelcast客户端集成,mongodb和AWS dynamoDB。你还可以带其他图书馆。