Jwt 当使用JWKS URL验证令牌时,与外部身份提供程序的KeyClope集成失败

Jwt 当使用JWKS URL验证令牌时,与外部身份提供程序的KeyClope集成失败,jwt,openid-connect,keycloak,jwk,Jwt,Openid Connect,Keycloak,Jwk,我正在KeyClope实例中配置一个外部身份提供程序,并试图让它使用外部JWKS URL验证令牌。使用从JWKS转换的PEM可以正常工作,但使用URL不起作用 登录时令牌验证失败,并显示以下消息: [org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider] (default task-4) Failed to make identity provider oauth callback: org.keycloak.broker.provide

我正在KeyClope实例中配置一个外部身份提供程序,并试图让它使用外部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
我调试了keydape服务器,获得了有关该问题的更多信息,并在类
JWKSUtils
中发现了一个“问题”:

/**
*@作者
*/
公共类JWKSUtils{
//...
公共静态映射getKeyWrappersForUse(JSONWebKeySet密钥集,JWK.Use requestedUse){
映射结果=新的HashMap();
for(JWK-JWK:keySet.getKeys()){
JWKParser=JWKParser.create(jwk);
if(jwk.getPublicKeyUse().equals(requestedUse.asString())和&parser.isKeyTypeSupported(jwk.getKeyType())){
KeyWrapper KeyWrapper=新的KeyWrapper();
setKid(jwk.getKeyId());
setAlgorithm(jwk.getAlgorithm());
setType(jwk.getKeyType());
setUse(getKeyUse(jwk.getPublicKeyUse());
setVerifyKey(parser.toPublicKey());
put(keyWrapper.getKid(),keyWrapper);
}
}
返回结果;
}
//...
}
由于调用
jwk.getPublicKeyUse()
返回
null
,因此
if
会因
NullPointerException
而失败

但是我发现它是
null
,因为JWKS URL返回一个没有属性use的键,根据规范这是可选的。[

KeyClope只接受返回所有定义了属性use的键的JWKS URL。但我尝试连接的IdP不会在键中返回该属性

在这种情况下,我应该向谁提交问题,IdP还是Key斗篷?或者我的配置中是否存在错误?

我在2019年8月向Key斗篷提交了一份关于这个确切问题的文件

他们的回答是:

在不验证alg和使用的情况下使用密钥是危险的 钥匙斗篷需要这些东西存在


在我的案例中,我联系了IdP,他们能够填充“使用”参数。如果这不是一个选项,那么您的解决方案就太难了。

作为一个解决方案,我在KeyClope实例上创建了一个自定义端点,该端点请求IdP JWKS,添加缺少的属性,并使用构建的新JWKS进行响应。它解决了问题,但没有回答原始问题。