繁体   English   中英

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

[英]Is there any part of JWT Keycloak token which can be used as a unique ID of the token itself?

编辑

我之前的问题是关于 Keycloak 令牌,但我发现的解决方案更通用,它适用于 JWT,无论 Keycloak 是什么。

背景/动机

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

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

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

问题

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

sid字段是这样工作的吗? 至少它似乎与sub不同。

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

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

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

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

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

在此处输入图像描述

最后我找到了JWT的详细文档: https://datatracker.ietf.org/doc/html/rfc7519

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

字段jti指定为:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM