【问题标题】:Is there any part of Keycloak token which can be used as a unique ID of the token itself?Keycloak 令牌是否有任何部分可以用作令牌本身的唯一 ID?
【发布时间】:2022-01-19 09:51:54
【问题描述】:

背景/动机

基于 Keycloak 令牌,我从我的数据库中获取用户的一些附加信息(sub 字段)。我想缓存信息,我正在寻找合适的缓存键。

我不想使用 sub 字段,因为我希望缓存条目在 Keycloak 令牌更改时失效(= 为同一用户生成新令牌时)。

我可以轻松地使用整个 Keycloak 令牌或其第三部分(签名)作为密钥。但是,它是一个相当长的字符串。

问题

Keycloak 令牌中是否有任何 字段,可以用作此特定令牌的唯一 ID?保证始终存在,并且始终针对令牌的新实例进行更改。

sid 字段是否像这样工作?至少看起来和sub不一样。

Keycloak 令牌中有几个 UUID,我对文档感到困惑。我发现只有这个 clearly arranged table 解释了 Keycloak 令牌字段的含义。

【问题讨论】:

  • “Keycloak 令牌更改。”令牌是不可变的,它永远不会改变。例如,最接近唯一的内容是附加用户的字段“iat”字段为 100%。但是如果关键的东西可以用来以更快的方式访问缓存,使用“iat”会破坏这个目的
  • 您好 - 如果后续请求中密钥发生变化,您将如何查找较旧的条目以进行失效?正如@dreamcrash 建议的那样(如果我误解了,我深表歉意),您应该保留密钥原样并使用iat 字段之类的内容来确定这是否是新令牌。假设您的缓存提供程序使用equals 进行键查找并允许对象作为键,您可以创建一个包含 sub+iat 的自定义对象,仅在子字段上实现 equals,一旦您获取键,您将键的 iat 与传入令牌的iat。
  • 如果传入令牌的iat 与存储的iat 不匹配,那么您可以假设令牌“已更改”。 iat 字段告诉您令牌的发布时间,因此相同subiat 的更新值会告诉您令牌已更新。请记住,通常情况下,访问令牌的寿命很短,因此您可能会发现自己失效了太多。另一种方法(我个人认为可能更好)是基于事件侦听器的方法。
  • 因此,基本上,如果 keycloak 上的用户数据发生更改,则事件侦听器会使缓存无效。有了这个,你可以进一步......eh..enrich(?)你的失效策略,而不是依赖令牌的生命周期。
  • @dreamcrash “当 Keycloak 令牌更改时”我的意思是“当为同一用户生成新令牌时”。 ——

标签: security keycloak access-token


【解决方案1】:

根据您的用例,我能想到使用的两个字段是id / email id 和过期。

  1. Id/email id 是唯一的并且始终存在,因此可以满足您的目的。

  2. 不能单独使用过期时间,因为同时为 2 个用户生成的 2 个令牌可能具有相同的过期时间。那我为什么要使用?如果您的缓存不支持 TTL,那么可能会有一些过时的条目不必要地占用您的缓存。因此,如果您将密钥保留为“expiration.id”,那么您可以每 24 小时左右运行一次辅助作业,以根据第一部分(即过期)从缓存中删除过时的条目。

这是我的 Java 应用程序中的示例 Keycloak 令牌对象:

【讨论】:

  • 嗨,我可能错了,但该 id 不属于它自己的令牌,而是属于包装令牌的 Java 对象。
  • sid 到底是什么?这个字段不能作为“Keycloak 令牌的唯一 ID”吗?
  • @dreamcrash 您的猜测可能是正确的。我没有设置来验证这一点。这张照片来自我的另一个答案。
  • @HonzaZidek 我不知道sid。在我拥有的上述数据中,它似乎不是令牌的一部分。我没有设置来检查最新的令牌结构。可以有十几种不同的方法。我建议 1. :)
  • 如果@dreamcrash 的猜测是正确的,那么您可以使用其他一些参数,如email id 而不是id,这将是用户独有的。
猜你喜欢
  • 1970-01-01
  • 2012-09-13
  • 2014-06-01
  • 2020-05-02
  • 2011-10-19
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 2016-08-05
相关资源
最近更新 更多