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

2024-03-13

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

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

我的验证过程非常简单:

1.) 从我的本地 docker KeyCloak 实例请求令牌(使用 Postman): POST 请求http://localhost:8080/auth/realms/dev/protocol/openid-connect/token 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.JWTJwtSecurityTokenHandle.ValidateSignature方法会导致签名无效并最终导致异常。

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

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


要获取用于签名/验证 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';

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐