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