Quarkus、Keycloft和OIDC代币刷新



我目前正在开发一个具有多个Quarkus服务和Keycloft RBAC的PoC。工作起来很有魅力,很容易引导并开始实现功能。

但我遇到了一个我无法在脑海中解决的问题。想象一下:

  1. 用户访问受保护的服务
  2. quarkus-oidc扩展通过HTTP重定向实现花式代币获取,cookie中的JWT持续30分钟
  3. 用户已通过身份验证并返回到web应用程序
  4. 用户在应用程序中工作,填写表格和数据
  5. 数据由JWT丰富的REST调用存储(我们通过hibernate-validator进行验证(
  6. 用户再次工作,耗时超过30分钟
  7. 想要存储另一个条目,但步骤3中的令牌现在已过期,API调用失败
  8. 用户不会高兴,所以我也不会

可能的解决方法:

  1. 使JWT的持续时间超过当前的30分钟,但这只是推迟了问题并打开了一些安全门
  2. 将用户的输入存储在本地存储中,以便稍后在令牌刷新后恢复(我们也会这样做,以避免丢失用户的工作(
  3. 在用户不知情的情况下"静默"刷新JS中的令牌。有最佳实践吗
  4. 我错过了一些重要的东西,现在互联网告诉我的应用程序有一个更好的架构

感谢互联网!

关于步骤3。在Quarkus 1.5.0中,如果刷新授权成功,添加quarkus.oidc.token.refresh-expired=true将刷新ID令牌并延长用户会话

对于此类用例,我倾向于使用JWT的相反版本。我将用户数据保存在共享数据服务(像Infinispan或Redis这样的数据网格(中。以便这些数据由用户键入并可用。我确实控制共享数据服务中该数据的TTL。

它可以是特定于应用程序的,也可以在少数应用程序之间共享。它确实带来了一些耦合,但JWT属性结构也是如此。

对于Quarkus,有一个Infinispan客户端集成,一个Hazelcast客户端集成,mongodb和AWS dynamoDB。你还可以带其他图书馆。

最新更新