当具有JWKS URL的验证令牌时,Keycloak与外部身份提供者的集成失败

时间:2019-11-14 21:14:29

标签: jwt openid-connect keycloak jwk

我正在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;
    }
    //...
}

ifNullPointerException失败,因为调用jwk.getPublicKeyUse()返回了null

但是我发现它是null,因为JWKS URL返回了一个没有属性 use 的键,该键根据规范是可选的。 [https://tools.ietf.org/html/rfc7517#section-4.2]

Keycloak仅接受JWKS URL,这些URL返回定义了 use 属性的所有密钥。但是我尝试连接的IdP不会在密钥中返回该属性。

鉴于这种情况,我应该向谁提出问题,IdP还是Keycloak?还是我在配置中做错了什么?

1 个答案:

答案 0 :(得分:0)

我于2019年8月向Keycloak提交了一个issue,涉及这一确切问题。

他们的答案:

在没有验证alg的情况下使用密钥是很危险的 Keycloak要求这些必须存在。

就我而言,我联系了IdP,他们能够填充“ use”参数。如果那不是一种选择,那么您就完全无法解决问题了。