我正在尝试验证使用本地运行生成的 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.JWT
和JwtSecurityTokenHandle.ValidateSignature
方法会导致签名无效并最终导致异常。
顺便说一句,我正在使用 Postman 及其授权功能访问令牌,配置如下图所示:
还有一个附注是我有一个用户“John”,它属于我的“Demo”领域。我使用他向 KeyCloak 请求访问令牌。