gpt4 book ai didi

spring-boot - Auth0 - 无法检索远程 JWK 集 : Read timed out

转载 作者:行者123 更新时间:2023-12-04 17:16:22 26 4
gpt4 key购买 nike

我正在遭受这个问题:无法检索远程 JWK 集:读取超时
我在 Spring boot 2.5.3 中使用 Java 11,
对于依赖项:

  • spring-security-oauth2-jose 5.5.1,
  • spring-boot-starter-oauth2-client
  • spring-boot-starter-security

  • Auth0 作为用户提供程序。
    任何线索?
    ...
    Caused by: java.lang.IllegalStateException: com.nimbusds.jose.RemoteKeySourceException: Couldn't retrieve remote JWK set: Read timed out
    at org.springframework.security.oauth2.jwt.JwtDecoderProviderConfigurationUtils.getSignatureAlgorithms(JwtDecoderProviderConfigurationUtils.java:107) ~[spring-security-oauth2-jose-5.5.1.jar:5.5.1]
    at org.springframework.security.oauth2.jwt.ReactiveJwtDecoders.withProviderConfiguration(ReactiveJwtDecoders.java:120) ~[spring-security-oauth2-jose-5.5.1.jar:5.5.1]
    at org.springframework.security.oauth2.jwt.ReactiveJwtDecoders.fromIssuerLocation(ReactiveJwtDecoders.java:100) ~[spring-security-oauth2-jose-5.5.1.jar:5.5.1]
    at org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerJwkConfiguration$JwtConfiguration.jwtDecoderByIssuerUri(ReactiveOAuth2ResourceServerJwkConfiguration.java:95) ~[spring-boot-autoconfigure-2.5.3.jar:2.5.3]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.9.jar:5.3.9]

    最佳答案

    我发现有时我仍然收到来自 Auth0 的超时。他们对 JWK 请求的响应似乎足够慢,需要更多的等待时间。在我的项目中导致它失败的超时是 com.nimbusds.jose.jwk.source.RemoteJWKSet 中定义的两个常量。

    public static final int DEFAULT_HTTP_CONNECT_TIMEOUT = 500;
    public static final int DEFAULT_HTTP_READ_TIMEOUT = 500;
    所以我提出了一个非常丑陋的解决方案,它对我有用,直到有人将这些常量转换为属性。
    假设您正在使用 Auth0 指南 https://auth0.com/docs/quickstart/backend/java-spring-security5/01-authorization
    并且您将“jwk-set-uri:https://your-domain/.well-known/jwks.json”键添加到您的属性中,因为 com.nimbusds.jose.jwk.source.RemoteJWKSet 不是bean 我可以用我自己的自定义实现替换,或者不能使用 AOP 来替换在构造函数中传递的超时参数,我不得不复制一些东西来制作我自己的所需类版本。
    解决方案
    我制作了自己的以下类版本,只是从原始版本中复制代码并在需要的地方进行自定义:
  • com.nimbusds.jose.jwk.source.RemoteJWKSet(自定义增加
    超时常量)
  •     public static final int DEFAULT_HTTP_CONNECT_TIMEOUT = 1000;
    public static final int DEFAULT_HTTP_READ_TIMEOUT = 1000;
  • org.springframework.security.oauth2.jwt.JwtDecoders(自定义创建我的自定义版本的 RemoteJWKSet 实例)
  •     private static JwtDecoder withProviderConfiguration(Map<String, Object> configuration, String issuer) {
    CustomJwtDecoderProviderConfigurationUtils.validateIssuer(configuration, issuer);
    OAuth2TokenValidator<Jwt> jwtValidator = JwtValidators.createDefaultWithIssuer(issuer);
    String jwkSetUri = configuration.get("jwks_uri").toString();
    CustomRemoteJWKSet<SecurityContext> jwkSource = new CustomRemoteJWKSet<>(url(jwkSetUri));
    Set<SignatureAlgorithm> signatureAlgorithms = CustomJwtDecoderProviderConfigurationUtils
    .getSignatureAlgorithms(jwkSource);
    NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder.withJwkSetUri(jwkSetUri)
    .jwsAlgorithms((algs) -> algs.addAll(signatureAlgorithms)).build();
    jwtDecoder.setJwtValidator(jwtValidator);
    return jwtDecoder;
    }
  • org.springframework.security.oauth2.jwt.JwtDecoderProviderConfigurationUtils(这没有自定义,但我不得不复制它,因为它从包外部看不到)

  • 然后我只是用自定义的替换了我的配置中的解码器
    @Bean
    public JwtDecoder jwtDecoder() {
    NimbusJwtDecoder jwtDecoder = (NimbusJwtDecoder)
    CustomJwtDecoders.fromOidcIssuerLocation(issuer);

    OAuth2TokenValidator<Jwt> audienceValidator = new AudienceValidator(audience);
    OAuth2TokenValidator<Jwt> withIssuer = JwtValidators.createDefaultWithIssuer(issuer);
    OAuth2TokenValidator<Jwt> withAudience = new DelegatingOAuth2TokenValidator<>(
    withIssuer, audienceValidator);

    jwtDecoder.setJwtValidator(withAudience);

    return jwtDecoder;
    }
    到目前为止,很好,没有更多的超时。

    关于spring-boot - Auth0 - 无法检索远程 JWK 集 : Read timed out,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68643595/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com