如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌

Posted

技术标签:

【中文标题】如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌【英文标题】:How to verify a HS256 signed JWT Token created with Keycloak authentication provider on jwt.io 【发布时间】:2020-02-18 10:18:34 【问题描述】:

我正在尝试验证在 https://jwt.io 上使用本地运行的 KeyCloak 身份验证提供程序生成的 HS256 JWT 令牌。

KeyCloack 实例在 docker 容器内的本地机器上运行。我已经应用了与此答案中描述的几乎相同的步骤(相反,它应用了 RS 算法,并按描述工作):https://***.com/a/55002225/1534753

我的验证程序很简单:

1.) 从我的本地 docker KeyCloak 实例请求令牌(使用 Postman): POST 请求http://localhost:8080/auth/realms/dev/protocol/openid-connect/token

2.) 复制 jwt.io 的“编码”部分中的令牌内容

3.) 我验证标头和有效负载是否符合预期且正确

4.) 我从我的 KeyCloak 实例管理仪表板中复制了客户端密码,您可以在下图中看到参考:

5.) 我将秘密粘贴到 jwt.io 上的“验证签名”部分,“编码”令牌部分发生更改,因此导致签名无效和无效(即不同)令牌。

我的核心问题是我在这里缺少什么?为什么当我应用预期的秘密时令牌会发生变化!?我是否应用了正确的秘密,即来自客户端的秘密?如果我正确理解 JWT 基础设施和标准,那么如果秘密(应用了预期的算法)有效,它应该保持不变。我的理由是,在 KeyCloak 上创建 JWT 的东西是特定的。我没有接触过 KeyCloak 上的 HS256 算法提供程序,所有内容都默认使用 docker 安装指南使用 KeyCloak。与token和算法相关的设置设置为使用HS256,并且算法在JWT的header部分中正确指定,可以在将编码的token粘贴到jwt.io的页面后进行验证。

我需要它来工作,因为我试图在 .NET Core Web API 应用程序中应用相同的 JWT 验证过程。我在那里遇到了整个问题,即在 System.IdentityModel.Tokens.JWTJwtSecurityTokenHandle.ValidateSignature 方法中,导致签名无效并最终导致异常。

附带说明,我正在使用 Postman 访问令牌及其授权功能,配置如下图所示:

另外一个说明是我有一个属于我的“演示”领域的用户“约翰”。我使用他从 KeyCloak 请求访问令牌。

【问题讨论】:

你能发一张来自 jwt.io 的截图吗? 很遗憾目前没有,但请理解我所说的正是发生了什么,编码部分完全改变,就像 KeyCloak 使用的密钥完全不同 您解决了吗?我也有同样的问题 @ndtreviv 我没有解决这个问题,我们转而使用 KeyCloak 的默认设置并将其默认 OAuth2 设置与 RSA 一起使用,但我们复制了公共 RSA 密钥并将其与 BouncyCastle lib 一起使用来验证 JWT。 【参考方案1】:

要获取用于签名/验证 HS256 令牌的密钥,请尝试使用以下 SQL:

SELECT value FROM component_config CC INNER JOIN component C ON(CC.component_id = C.id) WHERE C.realm_id = '<realm-id-here>' and provider_id = 'hmac-generated' AND CC.name = 'secret';

如果您使用生成的密钥来验证令牌,则签名应该匹配。我不确定这个秘密是否可以通过 UI 获得,可能不是。

来源:https://keycloak.discourse.group/t/invalid-signature-with-hs256-token/3228/3

【讨论】:

这里从来没有回答过你,但是生产服务是 RHSSO(它是 KeyCloak 的扩展),在一个 OpenShift 集群中,我不能像那样访问它的数据库。不过,感谢您的提示。 你救了我的命。非常感谢!【参考方案2】:

您可以尝试使用Keycloak Gatekeeper。 如果您想以这种方式验证该令牌,您需要将 Client Authenticator 更改为“Signed JWT with client secret”,否则您可以使用此“Gatekeeper”选项。 Here你可以阅读更多。

【讨论】:

以上是关于如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用 keycloak 将自定义键/值添加到 JWT 令牌有效负载或用户

在 JWT.IO 中验证签名

如何使用在线工具手动验证 JWT 签名

Keycloak 访问令牌与 UserInfo 令牌?

如何使用 jwt.io 手动验证从自定义授权服务器获得的令牌?

如何使用 Keycloak 和 PKCE 流实现 React SPA 身份验证?