我之前的问题只是关于Keycloft代币,但我发现的解决方案更一般,它适用于JWT,而不考虑Keycloft。
基于JWT Keycloak令牌,我从我的数据库中获取用户的一些附加信息(sub
字段)。我想缓存信息,我正在寻找缓存的适当密钥。
我不想使用< code>sub字段,因为我希望当Keycloak令牌改变时(当为同一用户生成新令牌时),缓存条目无效。
我可以轻松地使用整个Keycloak令牌或其第三部分(签名)作为密钥。但是,这是一个很长的字符串。
JWT密钥卡令牌中是否有任何字段可用作该特定令牌的唯一ID?其被保证总是存在,并且总是为令牌的新实例而改变。
sid
字段是这样工作的吗?至少它似乎与sub
不同。
Keycloak令牌中有几个UUID,我对文档感到困惑。我只找到这个清晰排列的表格,解释了Keycloak令牌字段的含义。
根据您的使用案例,我能想到使用的两个字段是< code>id / email id和expiration。
>
Id/email id是唯一的并且始终存在,因此这符合您的目的。
不能仅使用过期时间,因为同时为2个用户生成的2个令牌可能具有相同的过期时间。那我为什么要求使用?如果您的缓存不支持TTL,那么可能会有过时的条目不必要地占用您的缓存。因此,如果您将您的密钥保存为“expiration.id ”,那么您可以大约每24小时运行一次辅助作业,根据第一部分(即到期时间)从缓存中删除过时的条目。
这是我的Java应用程序中的示例Keycloak令牌对象:
最后我找到了https://datatracker.ietf.org/doc/html/rfc7519 JWT的详细资料
该字段不是特定于密钥斗篷的,而是在JWT标准中定义的。
将字段<code>jti</code>指定为:
jti
(JWT ID) 声明为 JWT 提供唯一标识符。标识符值的分配方式必须确保同一值意外分配给不同数据对象的概率可以忽略不计;如果应用程序使用多个颁发者,则还必须防止不同颁发者生成的值之间的冲突。jti
声明可用于防止重播 JWT。jti
值是区分大小写的字符串。使用此声明是可选的。
该字段完全符合我的要求,即“提供此特定令牌的唯一ID”。我们的密钥斗篷服务器似乎为字段分配了一个UUID。