JWT Keycloak 令牌是否有任何部分可以用作令牌本身的唯一 ID?

问题描述 投票:0回答:2

编辑

我的问题最初只是关于Keycloak令牌,但我找到的解决方案一般适用于JWT,无论Keycloak如何。

背景/动机

基于 JWT Keycloak 令牌,我从数据库中获取用户的一些附加信息(

sub
字段)。我想缓存信息,并且正在寻找合适的缓存密钥。

我不想使用

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

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

问题

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

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

Keycloak 令牌中有几个 UUID,我对文档感到困惑。我只找到了这个排列清晰的表格解释了Keycloak令牌字段的含义。

security jwt keycloak access-token
2个回答
2
投票

终于找到了JWT的详细文档:https://datatracker.ietf.org/doc/html/rfc7519

该字段不是 keycloak 特定的,它是在 JWT 标准中定义的。

指定字段

jti
为:

jti
(JWT ID) 声明为 JWT 提供唯一标识符。标识符值的分配方式必须确保相同值被意外分配给不同数据对象的可能性可以忽略不计;如果应用程序使用多个发行者,则也必须防止不同发行者产生的值之间发生冲突。
jti
声明可用于防止重播 JWT。
jti
值是区分大小写的字符串。使用此声明是可选的。

该字段完全符合我的要求“提供此特定令牌的唯一 ID”。看来我们的 keycloak 服务器为该字段分配了一个 UUID。

文档甚至建议使用该字段作为缓存键,如下所示

jti
声明可用于防止 JWT 被重放,

这正是我所需要的。


1
投票

根据您的用例,我可以想到使用的两个字段是

id / email id
和过期。

  1. Id/电子邮件 ID 是唯一的且始终存在,因此可以满足您的目的。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.