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

Ved*_*dić 7 oauth hmac jwt keycloak .net-core

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

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

我的验证过程非常简单:

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

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

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

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

在此输入图像描述

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

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

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

顺便说一句,我正在使用 Postman 及其授权功能访问令牌,配置如下图所示:

在此输入图像描述

还有一个附注是我有一个用户“John”,它属于我的“Demo”领域。我使用他向 KeyCloak 请求访问令牌。

小智 5

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

\n
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\';\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n


小智 1

您可以尝试使用Keycloak Gatekeeper。如果您想以这种方式验证该令牌,您需要将客户端身份验证器更改为“使用客户端密钥签名的 JWT”,否则您可以使用此“Gatekeeper”选项。在这里您可以阅读更多相关内容。