I'm suffering this one: Couldn't retrieve remote JWK set: Read timed out
I am using Java 11 with Spring boot 2.5.3,
for dependencies:
- spring-security-oauth2-jose 5.5.1,
- spring-boot-starter-oauth2-client
- spring-boot-starter-security
Auth0 as users provider.
Any clue ?
...
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]
5条答案
按热度按时间qybjjes11#
我发现有时候我仍然会收到Auth 0的超时。看起来他们对JWK请求的响应太慢了,需要更多的等待时间。在我的项目中,导致它失败的超时是com. nimbusds. jose. jwk. source. RemoteJWKSet中定义的两个常量。
所以我提出了一个非常丑陋的解决方案,它对我很有效,直到有人把这些常数变成了属性。
假设您使用的是Auth 0指南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来替换在构造函数中传递的超时参数,所以我不得不复制一些东西来制作我自己版本的所需类。
解决方案
我制作了以下类的自己的版本,只是从原始代码中复制了代码,并在需要的地方进行了定制:
然后,我将配置中的解码器替换为自定义解码器
到目前为止,一切顺利,没有更多的暂停。
zzoitvuj2#
这个答案和Juan的答案的主要区别在于,我使用的不是
RemoteJWKSet
,而是DefaultResourceRetriever
,我还必须复制并粘贴JwtDecoderProviderConfigurationUtils
作为JwtUtil
,以访问处理OAuth DOM的helper函数。真痛苦
YAML语言
sqxo8psd3#
您可以在为
JwtDecoder
创建Bean时配置自定义超时,如下所示:来源- Spring安全性文件:https://docs.spring.io/spring-security/site/docs/5.2.12.RELEASE/reference/html/oauth2.html#oauth2resourceserver-jwt-timeouts
在Auth 0配置的情况下,
jwtDecoder
Bean如下所示:m528fe3b4#
我遇到了同样的问题,似乎它无法从已知配置中获取jwk集。我仍然需要找出这是我的项目中的问题还是Auth 0中的问题。尝试在您的属性中显式添加它,之后它对我有效。我的如下所示:
另外,spring-boot-starter-oauth2-resource-server依赖关系应该足以完成这一任务。
j7dteeu85#
我发现我的auth0租户托管在不同的位置(在美国,尽管我住在欧洲),所以正如第一个答案中所建议的,阅读超时约束太小。在我在不同的地区创建了一个新租户后,这个问题就消失了。