我的问题最初只是关于Keycloak令牌,但我找到的解决方案一般适用于JWT,无论Keycloak如何。
基于 JWT Keycloak 令牌,我从数据库中获取用户的一些附加信息(
sub
字段)。我想缓存信息,并且正在寻找合适的缓存密钥。
我不想使用
sub
字段,因为我希望缓存条目在 Keycloak 令牌更改时(= 为同一用户生成新令牌时)无效。
我可以轻松使用整个 Keycloak 令牌或其第三部分(签名)作为密钥。然而,这是一个相当长的字符串。
JWT Keycloak 令牌中是否有任何 field 可以用作该特定令牌的唯一 ID?它保证始终存在,并且始终针对令牌的新实例进行更改。
sid
字段是这样工作的吗?至少看起来和sub
不一样。
Keycloak 令牌中有几个 UUID,我对文档感到困惑。我只找到了这个排列清晰的表格解释了Keycloak令牌字段的含义。
终于找到了JWT的详细文档:https://datatracker.ietf.org/doc/html/rfc7519
该字段不是 keycloak 特定的,它是在 JWT 标准中定义的。
指定字段
jti
为:
(JWT ID) 声明为 JWT 提供唯一标识符。标识符值的分配方式必须确保相同值被意外分配给不同数据对象的可能性可以忽略不计;如果应用程序使用多个发行者,则也必须防止不同发行者产生的值之间发生冲突。jti
声明可用于防止重播 JWT。jti
值是区分大小写的字符串。使用此声明是可选的。jti
该字段完全符合我的要求“提供此特定令牌的唯一 ID”。看来我们的 keycloak 服务器为该字段分配了一个 UUID。
文档甚至建议使用该字段作为缓存键,如下所示
声明可用于防止 JWT 被重放,jti
这正是我所需要的。