如何解决在 Keycloak 中没有找到孩子错误的 publicKey 是什么意思
在 Keycloak 中没有找到 publicKey for Kid 错误意味着什么
int[] costArray = new int[]{3,5,9,10,11,13};
int[] numTypeIndarray = new int[]{1,2,4,7,15};
int[] numTypeCumulArray = new int[]{1,3,14,25,40};
int[] indItemCostArray = new int[numTypeCumulArray[6]];
for (int i = 0; i < indItemCostArray.length; i++) {
for (int j = 0; j < numTypeIndarray[i]; j++) {
indItemCostArray[i+j] = costArray[j];
}
}
解决方法
该服务正在验证 JWT 的完整性,但失败了。
验证是通过根据 JWT 的标头和正文重新计算签名并将其与 JWT 中显示的签名进行比较来完成的。如果计算出的签名与 JWT 中的签名匹配,则 JWT 肯定来自预期的一方,并且没有第 3 方对其进行修改(尽管第 3 方可以看到它!)。
为了生成签名,在最常见的方法 RS256 的情况下,需要一个密钥。该密钥只能从令牌的发行者那里获得,以保证验证过程的正确性。出于这个原因,令牌仅在 Kid 字段中保存该键的引用 ID。
您的情况下的默认证书 URL 应为: https://foo.baz.com/auth/realms/sso/protocol/openid-connect/certs 响应应该包含一个类似于 Google's cert endpoint:
的响应的键数组{
"keys": [
{
"kty": "RSA","alg": "RS256","e": "AQAB","n": "nQPB_WqGG18pjGSFGQwRLcZkcRojHHweN27mV1oTNeeH2quq5NvWibLEheiukVP60nXcGNpkP_PaycYahEfvAnJGLX_IscGAOJ67WWFs4M8wXHH6g2mTnalcAYgmpN1QDMVgz4NcWISXNTR-8FZfWgFN4LDZgK4f0wXOaJlh_Bzh-plPLJQUXyY7mZTEVsH8X3wg2fvV0Hxj_HudjgFlYPdDri1Oi4vI0wiKV4nJCRZ-INH3OIvPl-05WVjZ-XTSXdNjLNx35NM2Npcrr9VpZ8Xeg7pr0wjamqd_07xfEAdtFxsN6Ay6Ecz3k0onQP-6SLRCGLrMAxifziivmmafCQ","use": "sig","kid": "7f548f6708690c21120b0ab668caa079acbc2b2f"
},{
"n": "psh4_fDTsNZ1JkC2BV6nsU7681neTu8D37bMwTzzT-hugnePDyLaR8a_2HnqJaABndr0793WQCkiDolIjX1wn0a6zTpdgCJL-vaFe2FqPg19TWsZ8O6oKZc_rtWu-mE8Po7RGzi9qPLv9FxJPbiGq_HnMUo0EG7J4sN3IuzbU--Wmuz8LWALwmfpE9CfOym8x5GdUzbDL1ltuC2zXCaxARDnPs6vKR6eW1MZgXqgQ6ZQO9FklH_b5WJYLBDmHAb6CguoeU-AozaoVrBHgkWoDkku7nMWoetULtgBP_tYtFM8zvJ9IDD6abZM0jl-bsHIm3XFz0MgAJ9FmPti9-iShQ","kty": "RSA","kid": "3df0a831e093fae1e24d77d47834405f95d17b54","use": "sig"
}
]
}
在正常情况下,可以在此响应中找到来自 JWT 的孩子,因此,可以通过对应的“n”字段的值来计算签名。但在你的情况下,孩子不在那里。
这种情况下的常见问题:
- keycloak 领域中引入了一个新密钥,并且孩子正在引用旧密钥
- openid-configuration 的 URL 不正确
- keycloak前面有缓存层,所以openid-configuration的响应不是最新的
- 被泄露的/第三方修改的令牌
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。