如何验证在 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.JWT
和 JwtSecurityTokenHandle.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 令牌有效负载或用户