我在我的 Keycloak 实例中配置了一个外部身份提供者,并试图让它使用外部 JWKS URL 来验证令牌。使用从 JWKS 转换的 PEM 工作正常,使用 URL 不起作用。
登录时令牌验证失败,并显示以下消息:
[org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider] (default task-4) Failed to make identity provider oauth callback: org.keycloak.broker.provider.IdentityBrokerException: token signature validation failed
我调试了 Keycloak 服务器,获得了更多关于该问题的信息,并在类中发现了一个“问题” JWKSUtils
:
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
*/
public class JWKSUtils {
//...
public static Map<String, KeyWrapper> getKeyWrappersForUse(JSONWebKeySet keySet, JWK.Use requestedUse) {
Map<String, KeyWrapper> result = new HashMap<>();
for (JWK jwk : keySet.getKeys()) {
JWKParser parser = JWKParser.create(jwk);
if (jwk.getPublicKeyUse().equals(requestedUse.asString()) && parser.isKeyTypeSupported(jwk.getKeyType())) {
KeyWrapper keyWrapper = new KeyWrapper();
keyWrapper.setKid(jwk.getKeyId());
keyWrapper.setAlgorithm(jwk.getAlgorithm());
keyWrapper.setType(jwk.getKeyType());
keyWrapper.setUse(getKeyUse(jwk.getPublicKeyUse()));
keyWrapper.setVerifyKey(parser.toPublicKey());
result.put(keyWrapper.getKid(), keyWrapper);
}
}
return result;
}
//...
}
if
失败并带有 a ,NullPointerException
因为调用jwk.getPublicKeyUse()
返回null
。
但我发现这是因为 JWKS URL 返回一个没有属性usenull
的单个键,根据规范,这是可选的。[https://www.rfc-editor.org/rfc/rfc7517#section-4.2]
Keycloak 仅接受 JWKS URL,这些 URL 返回所有已定义属性使用的键。但是我尝试连接的 IdP 不会在密钥中返回该属性。
鉴于这种情况,我应该向谁提出问题,IdP 还是 Keycloak?还是我在配置中做错了什么?