【发布时间】: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字段告诉您令牌的发布时间,因此相同sub的iat的更新值会告诉您令牌已更新。请记住,通常情况下,访问令牌的寿命很短,因此您可能会发现自己失效了太多。另一种方法(我个人认为可能更好)是基于事件侦听器的方法。 -
因此,基本上,如果 keycloak 上的用户数据发生更改,则事件侦听器会使缓存无效。有了这个,你可以进一步......eh..enrich(?)你的失效策略,而不是依赖令牌的生命周期。
-
@dreamcrash “当 Keycloak 令牌更改时”我的意思是“当为同一用户生成新令牌时”。 ——
标签: security keycloak access-token