【发布时间】:2020-02-18 10:18:34
【问题描述】:
我正在尝试验证在 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 的“编码”部分中的令牌内容
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。
标签: .net-core oauth jwt keycloak hmac