spring-security OidcId令牌解码器工厂如何同时支持签名算法. RS256和签名算法. RS512

piah890a  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(181)

对于资源服务器,它就像下面这样简单

@Bean
fun jwtDecoder(): JwtDecoder {
    // makes a request to the JWK Set endpoint
    val jwsKeySelector: JWSKeySelector<SecurityContext> = JWSAlgorithmFamilyJWSKeySelector.fromJWKSetURL<SecurityContext>(this.jwkSetUrl)
    val jwtProcessor: DefaultJWTProcessor<SecurityContext> = DefaultJWTProcessor()
    jwtProcessor.jwsKeySelector = jwsKeySelector
    return NimbusJwtDecoder(jwtProcessor)
}

并且它从公钥端点获取算法。
但它不适用于OidcIdTokenDecoderFactory,因为https://github.com/spring-projects/spring-security/blob/6.0.0-M6/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/oidc/authentication/OidcIdTokenDecoderFactory.java会创建一个新的JwtDecoder
有什么想法吗?或者我只能定制一个OidcIdTokenDecoderFactory

9fkzdhlc

9fkzdhlc1#

OidcIdTokenDecoderFactory确实是以自定义方式提供客户端所用算法的正确配置钩子。
例如,您可以指定下列项目:

@Bean
public JwtDecoderFactory<ClientRegistration> idTokenDecoderFactory() {
    OidcIdTokenDecoderFactory idTokenDecoderFactory = new OidcIdTokenDecoderFactory();
    idTokenDecoderFactory.setJwsAlgorithmResolver(clientRegistration -> {
        @SuppressWarnings("unchecked")
        List<String> supportedAlgorithms =
                (List<String>) clientRegistration.getProviderDetails()
                        .getConfigurationMetadata()
                        .get("id_token_signing_alg_values_supported");
        return SignatureAlgorithm.from(supportedAlgorithms.get(0));
    });
    return idTokenDecoderFactory;
}

请注意,这是一个假设第一个可用算法的简单示例。您可以提供任何所需的逻辑,但它必须返回单个算法。
#11049中有一些关于这个问题的很好的背景。

相关问题