Quarkus、Keycloak 和 OIDC 令牌刷新

Quarkus, Keycloak and OIDC token refresh

我目前正在研究具有多个 Quarkus 服务和 Keycloak RBAC 的 PoC。工作起来很有魅力,很容易 bootstrap 并开始实现功能。

但是我遇到了一个我无法解决的问题。想象一下:

  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. 我错过了一些重要的东西,现在互联网告诉我一个更好的应用程序架构。

感谢互联网!

对于这样的用例,我倾向于 JWT 的逆向。我将用户数据保存在共享数据服务中(像 Infinispan 或 Redis 这样的数据网格)。因此,此数据由用户键入并可用。我控制共享数据服务中该数据的 TTL。

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

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

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