当我访问 keycloak 管理控制台(!远程)并创建客户端时:
keycloak OIDC JSON 没有公钥
我希望 JSON 中有类似的内容:
"realm-public-key": "MIIBIjANBg....
文件说:
在 2.3.0 版本中,我们添加了对公钥轮换的支持。当管理员在 Keycloak 管理控制台中轮换领域密钥时,客户端适配器将能够识别它并自动从 Keycloak 下载新的公钥。但是,如果您的适配器中没有带有硬编码公钥的领域公钥选项,则会自动下载新密钥。因此,我们不再建议在适配器配置中使用领域公钥选项。请注意,此选项仍然受支持,但仅当您确实希望在适配器配置中使用硬编码公钥并且从不从 Keycloak 下载公钥时,它可能会很有用。从理论上讲,这样做的一个原因可能是,如果适配器和 Keycloak 之间的网络不受信任,则可以避免中间人攻击,但在这种情况下,使用 HTTPS 是更好的选择,这将保护之间的所有请求适配器和钥匙斗篷。
http://localhost:8080/auth/realms/myrealm/.well-known/openid-configuration
但是公钥是在jwks_uri下发布的,就是这样的:
http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/certs
使用第二个 URL,使用 connect2id 库验证 JWT 非常容易(https://connect2id.com/products/nimbus-jose-jwt/examples/validating-jwt-access-tokens):
...
JWT idToken = JWTParser.parse(bearerAccessToken.toString());
Nonce expectedNonce = null;
Issuer iss = new Issuer("http://localhost:8080/auth/realms/myrealm");
JWSAlgorithm jwsAlg = JWSAlgorithm.RS256;
URL jwkSetURL = new URL("http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/certs");
IDTokenValidator validator = new IDTokenValidator(iss, clientID, jwsAlg, jwkSetURL);
IDTokenClaimsSet claims = validator.validate(idToken, expectedNonce);
...