贵州建设工程招标协会网站,定制网站建设服务器,餐饮门户网站 方案怎么做,网站建设公司怎么盈目录
一、JWT的最小依赖
二、JWT的最基本配置
1、指定授权服务器
2、初始预期#xff08;Startup Expectations#xff09;
3、运行时预期#xff08;Runtime Expectations#xff09;
三、JWT认证是如何工作的
四、直接指定授权服务器 JWK Set Uri
五、提供 audie…目录
一、JWT的最小依赖
二、JWT的最基本配置
1、指定授权服务器
2、初始预期Startup Expectations
3、运行时预期Runtime Expectations
三、JWT认证是如何工作的
四、直接指定授权服务器 JWK Set Uri
五、提供 audiences
六、覆盖或取代启动自动配置
1、使用jwkSetUri()
2、使用decoder()
3、暴露一个JwtDecoderBean
七、配置受信任的算法
1、通过Spring Boot实现
2、使用 Builder
3、来自 JWK Set 的响应
八、信任单一非对称密钥
1、通过 Spring Boot 实现
2、使用 Builder
九、信任单一对称密钥
十、配置 Authorization授权
1、手动提取权限
十一、配置验证
1、自定义时间戳验证
2、配置自定义验证器Validator
十二、配置 Claim 集映射
1、定制单一 Claim 的转换
2、添加 Claim
3、删除 Claim
4、重命名 Claim
5、配置超时 一、JWT的最小依赖
大多数资源服务器支持被收集到 spring-security-oauth2-resource-server 中。然而对JWT的解码和验证的支持是在 spring-security-oauth2-jose 中这意味着为了拥有一个支持JWT编码的 Bearer Token 的工作资源服务器两者都是必要的。
二、JWT的最基本配置
在使用 Spring Boot 时将一个应用程序配置为资源服务器包括两个基本步骤。首先包括所需的依赖其次指定授权服务器的位置。
1、指定授权服务器
在Spring Boot应用程序中要指定使用哪一个授权服务器只需
spring:security:oauth2:resourceserver:jwt:issuer-uri: https://idp.example.com/issuer
其中 idp.example.com/issuer是授权服务器将发出的JWT令牌的 iss claim 中包含的值。资源服务器将使用这个属性来进一步自我配置发现授权服务器的公钥并随后验证传入的 JWT。 要使用 issuer-uri 属性还必须是 idp.example.com/issuer/.well-known/openid-configuration、idp.example.com/.well-known/openid-configuration/issuer 或 idp.example.com/.well-known/oauth-authorization-server/issuer 中的一个是授权服务器的支持端点。这个端点被称为 提供者配置 端点或 授权服务器元数据 端点。
就这样
2、初始预期Startup Expectations
当使用该属性和这些依赖关系时资源服务器将自动配置自己以验证JWT编码的Bearer Token。
它通过一个确定性的启动过程来实现这一点。
查询提供者配置或授权服务器元数据端点的 jwks_url 属性查询 jwks_url 端点的支持算法配置验证策略以查询 jwks_url 中找到的算法的有效公钥。配置验证策略根据 idp.example.com验证每个JWTs iss claim。
这个过程的一个结果是授权服务器必须启动并接收请求以便资源服务器成功启动。 如果在资源服务器查询时授权服务器已经停机给定适当的超时那么启动将失败。
3、运行时预期Runtime Expectations
一旦应用程序启动资源服务器将尝试处理任何包含 Authorization: Bearer 头的请求。
GET / HTTP/1.1
Authorization: Bearer some-token-value # Resource Server will process this
只要指定了这个 scheme资源服务器就会尝试根据 Bearer Token 规范来处理请求。
给定一个格式良好的JWT资源服务器将
根据启动期间从 jwks_url 端点获得的公钥验证其签名并与JWT相匹配。验证JWT的 exp 和 nbf 时间戳以及JWT的 iss claim。将每个 scope 映射到一个前缀为 SCOPE_ 的授权。 随着授权服务器提供新的密钥Spring Security将自动轮换用于验证JWTs的密钥。
由此产生的 Authentication#getPrincipal 默认为Spring Security Jwt 对象Authentication#getName 映射到JWT的 sub 属性如果有的话。
从这里考虑跳转到
JWT认证是如何工作的如何在不将资源服务器的启动与授权服务器的可用性挂钩的情况下进行配置如何在非Spring Boot的情况下进行配置
三、JWT认证是如何工作的
接下来让我们看看Spring Security用来支持基于servlet的应用程序中的 JWT 认证的架构组件比如我们刚才看到的那个。
JwtAuthenticationProvider 是一个 AuthenticationProvider 实现利用 JwtDecoder 和 JwtAuthenticationConverter 来验证JWT。
让我们来看看 JwtAuthenticationProvider 是如何在Spring Security中工作的。图中解释了数字中的 AuthenticationManager 在 读取 Bearer Token时的工作细节。 Figure 1. JwtAuthenticationProvider Usage
读取 Bearer Token 的认证 Filter 将一个 BearerTokenAuthenticationToken 传递给由 ProviderManager 实现的认证管理器。
ProviderManager 被配置为使用一个 JwtAuthenticationProvider 类型的 AuthenticationProvider。
JwtAuthenticationProvider 使用 JwtDecoder 对 Jwt 进行解码、验证和确认。
JwtAuthenticationProvider 然后使用 JwtAuthenticationConverter 将 Jwt 转换为授予权限的集合Collection 。
当认证成功时返回的 Authentication 是 JwtAuthenticationToken 类型的并且有一个 principal 是由配置的 JwtDecoder 返回的 Jwt。最终返回的 JwtAuthenticationToken 将被认证 Filter 设置在 SecurityContextHolder 上。
四、直接指定授权服务器 JWK Set Uri
如果授权服务器不支持任何配置端点或者如果资源服务器必须能够独立于授权服务器启动那么也可以提供 jwk-set-uri。
spring:security:oauth2:resourceserver:jwt:issuer-uri: https://idp.example.comjwk-set-uri: https://idp.example.com/.well-known/jwks.json JWK Set uri不是标准化的但通常可以在授权服务器的文档中找到。
因此资源服务器在启动时将不会ping授权服务器。我们仍然指定了 issuer-uri这样资源服务器仍然会验证传入的JWT的 iss claim。 This property can also be supplied directly on the DSL.
五、提供 audiences
如前所述issuer-uri 属性验证了 iss claim这是谁发送的JWT。
Boot 还具有用于验证 aud claim 的 audiences 属性这是 JWT 的发送对象。
资源服务器的 audience 可以这样表示
spring:security:oauth2:resourceserver:jwt:issuer-uri: https://idp.example.comaudiences: https://my-resource-server.example.com 如果需要你也可以 通过编程添加 aud 验证。
结果是如果 JWT 的 iss claim 不是 idp.example.com且其 aud claim 的列表中不包含 my-resource-server.example.com则验证将失败。
六、覆盖或取代启动自动配置
有两个 Bean 是Spring Boot代表资源服务器生成的。
第一个是 SecurityFilterChain它将应用程序配置为资源服务器。当包括 spring-security-oauth2-jose 时这个 SecurityFilterChain 看起来像
Default JWT Configuration
Java
Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize - authorize.anyRequest().authenticated()).oauth2ResourceServer((oauth2) - oauth2.jwt(Customizer.withDefaults()));return http.build();
}
如果应用程序没有公开 SecurityFilterChain Bean那么Spring Boot将公开上述的默认bean。
替换它就像在应用程序中公开该bean一样简单。
Custom JWT Configuration
Java
Configuration
EnableWebSecurity
public class MyCustomSecurityConfiguration {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize - authorize.requestMatchers(/messages/**).hasAuthority(SCOPE_message:read).anyRequest().authenticated()).oauth2ResourceServer(oauth2 - oauth2.jwt(jwt - jwt.jwtAuthenticationConverter(myConverter())));return http.build();}
}
以上要求任何以 /messages/ 开头的URL的scope为 message:read。
oauth2ResourceServer DSL上的方法也将覆盖或取代自动配置。
例如Spring Boot 创建的第二个 Bean 是一个 JwtDecoder它 将 String token 解码为 Jwt 的验证实例。
JWT Decoder
Java
Bean
public JwtDecoder jwtDecoder() {return JwtDecoders.fromIssuerLocation(issuerUri);
} 调用 JwtDecoders#fromIssuerLocation 就是调用提供者配置或授权服务器元数据端点以便导出JWK Set Uri。
如果应用程序没有暴露一个 JwtDecoder Bean那么Spring Boot将暴露上述默认的 JwtDecoder。
它的配置可以用 jwkSetUri() 重写或用 decoder() 替换。
或者如果你根本没有使用Spring Boot那么这两个组件—filter chain 和 JwtDecoder 都可以用XML指定。
过滤器链filter chain是这样指定的。
Default JWT Configuration
Java
httpintercept-uri pattern/** accessauthenticated/oauth2-resource-serverjwt decoder-refjwtDecoder//oauth2-resource-server
/http
而 JwtDecoder 是这样的
JWT Decoder
Java
bean idjwtDecoderclassorg.springframework.security.oauth2.jwt.JwtDecodersfactory-methodfromIssuerLocationconstructor-arg value${spring.security.oauth2.resourceserver.jwt.jwk-set-uri}/
/bean
1、使用jwkSetUri()
授权服务器的 JWK Set Uri 可以 作为一个配置属性 来配置也可以在DSL中提供。
JWK Set Uri Configuration
Java
Configuration
EnableWebSecurity
public class DirectlyConfiguredJwkSetUri {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize - authorize.anyRequest().authenticated()).oauth2ResourceServer(oauth2 - oauth2.jwt(jwt - jwt.jwkSetUri(https://idp.example.com/.well-known/jwks.json)));return http.build();}
}
使用 jwkSetUri() 优先于任何配置属性。
2、使用decoder()
比 jwkSetUri() 更强大的是 decoder()它将完全取代 JwtDecoder 的任何Boot自动配置。
JWT Decoder Configuration
Java
Configuration
EnableWebSecurity
public class DirectlyConfiguredJwtDecoder {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize - authorize.anyRequest().authenticated()).oauth2ResourceServer(oauth2 - oauth2.jwt(jwt - jwt.decoder(myCustomDecoder())));return http.build();}
}
当需要更深入的配置时如 validation、mapping或request timeouts这很方便。
3、暴露一个JwtDecoderBean
或者暴露一个JwtDecoder Bean 与 decoder() 有同样的效果。
你可以像这样用 jwkSetUri 构建一个
Java
Bean
public JwtDecoder jwtDecoder() {return NimbusJwtDecoder.withJwkSetUri(jwkSetUri).build();
}
或者你可以使用 issuer并让 NimbusJwtDecoder 在调用 build() 时查找 jwkSetUri如下所示
Java
Bean
public JwtDecoder jwtDecoder() {return NimbusJwtDecoder.withIssuerLocation(issuer).build();
} 或者如果默认值对你有效你也可以使用 JwtDecoders除了配置 decoder 的验证器之外它还可以完成上述工作
Java
Bean
public JwtDecoders jwtDecoder() {return JwtDecoders.fromIssuerLocation(issuer);
}
七、配置受信任的算法
默认情况下NimbusJwtDecoder以及资源服务器将只信任和验证使用 RS256 的令牌。
你可以通过Spring Boot、NimbusJwtDecoder builder或从 JWK Set response 中定制。
1、通过Spring Boot实现
设置算法的最简单方法是配置一个属性。
spring:security:oauth2:resourceserver:jwt:jws-algorithm: RS512jwk-set-uri: https://idp.example.org/.well-known/jwks.json
2、使用 Builder
不过为了获得更大的权力我们可以使用 NimbusJwtDecoder 附带的一个构建器。
Java
Bean
JwtDecoder jwtDecoder() {return NimbusJwtDecoder.withIssuerLocation(this.issuer).jwsAlgorithm(RS512).build();
}
多次调用 jwsAlgorithm 将配置 NimbusJwtDecoder 以信任一种以上的算法像这样。
Java
Bean
JwtDecoder jwtDecoder() {return NimbusJwtDecoder.withIssuerLocation(this.issuer).jwsAlgorithm(RS512).jwsAlgorithm(ES512).build();
}
或者你可以调用 jwsAlgorithms。
Java
Bean
JwtDecoder jwtDecoder() {return NimbusJwtDecoder.withIssuerLocation(this.issuer).jwsAlgorithms(algorithms - {algorithms.add(RS512);algorithms.add(ES512);}).build();
}
3、来自 JWK Set 的响应
由于 Spring Security 的 JWT 支持基于 Nimbus因此你也可以使用它的所有强大功能。
例如Nimbus有一个 JWSKeySelector 实现它将根据JWK Set URI的响应Response来选择算法集。你可以用它来生成一个 NimbusJwtDecoder像这样。
Java
Bean
public JwtDecoder jwtDecoder() {// makes a request to the JWK Set endpointJWSKeySelectorSecurityContext jwsKeySelector JWSAlgorithmFamilyJWSKeySelector.fromJWKSetURL(this.jwkSetUrl);DefaultJWTProcessorSecurityContext jwtProcessor new DefaultJWTProcessor();jwtProcessor.setJWSKeySelector(jwsKeySelector);return new NimbusJwtDecoder(jwtProcessor);
}
八、信任单一非对称密钥
比用JWK Set端点支持资源服务器更简单的是硬编码一个RSA公钥。公钥可以通过Spring Boot或 使用 Builder来提供。
1、通过 Spring Boot 实现
通过Spring Boot指定一个密钥是非常简单的。密钥的位置可以像这样指定。
spring:security:oauth2:resourceserver:jwt:public-key-location: classpath:my-key.pub
或者为了能够进行更复杂的查询你可以用 RsaKeyConversionServicePostProcessor 进行后处理。
Java
Bean
BeanFactoryPostProcessor conversionServiceCustomizer() {return beanFactory -beanFactory.getBean(RsaKeyConversionServicePostProcessor.class).setResourceLoader(new CustomResourceLoader());
}
指定你的key的位置。
key.location: hfds://my-key.pub
然后自动注入value。
Java
Value(${key.location})
RSAPublicKey key;
2、使用 Builder
要直接连接一个 RSAPublicKey你可以简单地使用适当的 NimbusJwtDecoder builder像这样。
Java
Bean
public JwtDecoder jwtDecoder() {return NimbusJwtDecoder.withPublicKey(this.key).build();
}
九、信任单一对称密钥
使用单一的对称密钥也很简单。你可以简单地加载你的 SecretKey 并使用适当的 NimbusJwtDecoder builder像这样。
Java
Bean
public JwtDecoder jwtDecoder() {return NimbusJwtDecoder.withSecretKey(this.key).build();
}
十、配置 Authorization授权
从OAuth 2.0授权服务器发出的JWT通常会有一个 scope 或 scp 属性表明它被授予的scope或权限例如
{ …, scope : messages contacts}
当出现这种情况时资源服务器将尝试把这些scope强制性的成一个授予权限的列表在每个scope前面加上 SCOPE_ 字符串。
这意味着要用从JWT派生的scope来保护一个端点或方法相应的表达式应该包括这个前缀。
Authorization Configuration
Java
Configuration
EnableWebSecurity
public class DirectlyConfiguredJwkSetUri {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize - authorize.requestMatchers(/contacts/**).hasAuthority(SCOPE_contacts).requestMatchers(/messages/**).hasAuthority(SCOPE_messages).anyRequest().authenticated()).oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);return http.build();}
}
或者类似于方法安全method security。
Java
PreAuthorize(hasAuthority(SCOPE_messages))
public ListMessage getMessages(...) {}
1、手动提取权限
然而在很多情况下这个默认值是不够的。例如有些授权服务器并不使用 scope 属性而是有自己的自定义属性。或者在其他时候资源服务器可能需要将属性或属性的构成调整为内部化的授权。
为此Spring Security提供了 JwtAuthenticationConverter它负责 将 Jwt 转换为 Authentication。默认情况下Spring Security会将 JwtAuthenticationProvider 与 JwtAuthenticationConverter 的默认实例连接起来。
作为配置 JwtAuthenticationConverter 的一部分你可以提供一个附属的转换器从 Jwt 到授予权限集合Collection。
假设你的授权服务器在一个名为 authorities 的自定义 claim 中交流授权。在这种情况下你可以配置 JwtAuthenticationConverter 应该检查的 claim像这样。
Authorities Claim Configuration
Java
Bean
public JwtAuthenticationConverter jwtAuthenticationConverter() {JwtGrantedAuthoritiesConverter grantedAuthoritiesConverter new JwtGrantedAuthoritiesConverter();grantedAuthoritiesConverter.setAuthoritiesClaimName(authorities);JwtAuthenticationConverter jwtAuthenticationConverter new JwtAuthenticationConverter();jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(grantedAuthoritiesConverter);return jwtAuthenticationConverter;
}
你也可以把权限的前缀配置成不同的。你可以像这样把每个权限的前缀改为 ROLE_而不是用 SCOPE_。
Authorities Prefix Configuration
Java
Bean
public JwtAuthenticationConverter jwtAuthenticationConverter() {JwtGrantedAuthoritiesConverter grantedAuthoritiesConverter new JwtGrantedAuthoritiesConverter();grantedAuthoritiesConverter.setAuthorityPrefix(ROLE_);JwtAuthenticationConverter jwtAuthenticationConverter new JwtAuthenticationConverter();jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(grantedAuthoritiesConverter);return jwtAuthenticationConverter;
}
或者你可以通过调用 JwtGrantedAuthoritiesConverter#setAuthorityPrefix() 完全删除前缀。
为了提高灵活性DSL支持用任何实现 ConverterJwt, AbstractAuthenticationToken 的类来完全替换converter。
Java
static class CustomAuthenticationConverter implements ConverterJwt, AbstractAuthenticationToken {public AbstractAuthenticationToken convert(Jwt jwt) {return new CustomAuthenticationToken(jwt);}
}// ...Configuration
EnableWebSecurity
public class CustomAuthenticationConverterConfig {Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize - authorize.anyRequest().authenticated()).oauth2ResourceServer(oauth2 - oauth2.jwt(jwt - jwt.jwtAuthenticationConverter(new CustomAuthenticationConverter())));return http.build();}
}
十一、配置验证
使用 最小的Spring Boot配置表明授权服务器的发行者URI资源服务器将默认验证 iss claim 以及 exp 和 nbf 时间戳 claim。
在需要定制验证的情况下资源服务器会提供两个标准的验证器同时也接受自定义的 OAuth2TokenValidator 实例。
1、自定义时间戳验证
JWT通常有一个有效期开始时间在 nbf claim 中指出结束时间在 exp 声明中指出。
然而每台服务器都可能经历时钟漂移这可能导致令牌在一台服务器上显示为过期而在另一台服务器上却不是。随着分布式系统中合作服务器数量的增加这可能会造成一些实施上的困扰。
资源服务器使用 JwtTimestampValidator 来验证令牌的有效性它可以配置一个 clockSkew 来缓解上述问题。
Java
Bean
JwtDecoder jwtDecoder() {NimbusJwtDecoder jwtDecoder (NimbusJwtDecoder)JwtDecoders.fromIssuerLocation(issuerUri);OAuth2TokenValidatorJwt withClockSkew new DelegatingOAuth2TokenValidator(new JwtTimestampValidator(Duration.ofSeconds(60)),new JwtIssuerValidator(issuerUri));jwtDecoder.setJwtValidator(withClockSkew);return jwtDecoder;
} 默认情况下资源服务器配置的时钟偏移为60秒。
2、配置自定义验证器Validator
使用 OAuth2TokenValidator API添加 aud claim 的检查很简单。
JavaKotlin
OAuth2TokenValidatorJwt audienceValidator() {return new JwtClaimValidatorListString(AUD, aud - aud.contains(messaging));
}
或者为了更多的控制你可以实现你自己的 OAuth2TokenValidator。
Java
static class AudienceValidator implements OAuth2TokenValidatorJwt {OAuth2Error error new OAuth2Error(custom_code, Custom error message, null);Overridepublic OAuth2TokenValidatorResult validate(Jwt jwt) {if (jwt.getAudience().contains(messaging)) {return OAuth2TokenValidatorResult.success();} else {return OAuth2TokenValidatorResult.failure(error);}}
}// ...OAuth2TokenValidatorJwt audienceValidator() {return new AudienceValidator();
}
然后为了添加到资源服务器中只需指定 JwtDecoder 实例即可。
Java
Bean
JwtDecoder jwtDecoder() {NimbusJwtDecoder jwtDecoder (NimbusJwtDecoder)JwtDecoders.fromIssuerLocation(issuerUri);OAuth2TokenValidatorJwt audienceValidator audienceValidator();OAuth2TokenValidatorJwt withIssuer JwtValidators.createDefaultWithIssuer(issuerUri);OAuth2TokenValidatorJwt withAudience new DelegatingOAuth2TokenValidator(withIssuer, audienceValidator);jwtDecoder.setJwtValidator(withAudience);return jwtDecoder;
} 如前所述你可以在 Boot 中 配置 aud 验证。
十二、配置 Claim 集映射
Spring Security使用 Nimbus 库来解析JWT并验证其签名。因此Spring Security受制于Nimbus对每个字段值的解释以及如何将每个字段强制成一个Java类型。
例如由于Nimbus仍然与Java 7兼容它不使用 Instant 来表示时间戳字段。
而且完全可以使用不同的库或用于JWT处理它可能会做出自己的强制决定需要进行调整。
或者很简单资源服务器可能想出于特定领域的原因从JWT中添加或删除claim。
为了这些目的资源服务器支持用 MappedJwtClaimSetConverter 映射JWT请求集。
1、定制单一 Claim 的转换
默认情况下MappedJwtClaimSetConverter 将试图将 claim 强制为以下类型。 Claim Java 类型 aud CollectionString exp Instant iat Instant iss String jti String nbf Instant sub String
可以使用 MappedJwtClaimSetConverter.withDefaults 来配置单个 claim 的转换策略。
Java
Bean
JwtDecoder jwtDecoder() {NimbusJwtDecoder jwtDecoder NimbusJwtDecoder.withIssuerLocation(issuer).build();MappedJwtClaimSetConverter converter MappedJwtClaimSetConverter.withDefaults(Collections.singletonMap(sub, this::lookupUserIdBySub));jwtDecoder.setClaimSetConverter(converter);return jwtDecoder;
}
这将保持所有的默认值除了它将覆盖 sub 的默认 claim converter。
2、添加 Claim
MappedJwtClaimSetConverter 也可以用来添加一个自定义的 claim例如为了适应现有的系统。
Java
MappedJwtClaimSetConverter.withDefaults(Collections.singletonMap(custom, custom - value)); 3、删除 Claim
删除claim也很简单使用相同的API。
Java
MappedJwtClaimSetConverter.withDefaults(Collections.singletonMap(legacyclaim, legacy - null)); 4、重命名 Claim
在更复杂的情况下如同时咨询多个claim或重命名一个claim资源服务器接受任何实现 ConverterMapString, Object, MapString,Object 的类。
Java
public class UsernameSubClaimAdapter implements ConverterMapString, Object, MapString, Object {private final MappedJwtClaimSetConverter delegate MappedJwtClaimSetConverter.withDefaults(Collections.emptyMap());public MapString, Object convert(MapString, Object claims) {MapString, Object convertedClaims this.delegate.convert(claims);String username (String) convertedClaims.get(user_name);convertedClaims.put(sub, username);return convertedClaims;}
}
然后可以像正常一样提供实例。
Java
Bean
JwtDecoder jwtDecoder() {NimbusJwtDecoder jwtDecoder NimbusJwtDecoder.withIssuerLocation(issuer).build();jwtDecoder.setClaimSetConverter(new UsernameSubClaimAdapter());return jwtDecoder;
}
5、配置超时
默认情况下资源服务器使用连接和套接字超时30秒来与授权服务器进行协调。
这在某些情况下可能太短了。此外它没有考虑到更复杂的模式如退订和发现。
为了调整资源服务器连接到授权服务器的方式NimbusJwtDecoder 接受了一个 RestOperations 的实例。
Java
Bean
public JwtDecoder jwtDecoder(RestTemplateBuilder builder) {RestOperations rest builder.setConnectTimeout(Duration.ofSeconds(60)).setReadTimeout(Duration.ofSeconds(60)).build();NimbusJwtDecoder jwtDecoder NimbusJwtDecoder.withIssuerLocation(issuer).restOperations(rest).build();return jwtDecoder;
}
另外默认情况下资源服务器会在内存中缓存授权服务器的JWK集5分钟你可能想调整一下。此外它没有考虑到更复杂的缓存模式如驱逐或使用共享缓存。
为了调整资源服务器缓存JWK集的方式NimbusJwtDecoder 接受一个 Cache 的实例。
Java
Bean
public JwtDecoder jwtDecoder(CacheManager cacheManager) {return NimbusJwtDecoder.withIssuerLocation(issuer).cache(cacheManager.getCache(jwks)).build();
}
当给定一个 Cache 时资源服务器将使用JWK Set Uri作为键JWK Set JSON作为值。 Spring不是一个缓存提供者所以你需要确保包含适当的依赖关系比如 spring-boot-starter-cache 和你喜欢的缓存提供者。 无论是套接字还是缓存超时你可能反而想直接与Nimbus合作。要做到这一点请记住 NimbusJwtDecoder 有一个构造函数它接收 Nimbus 的 JWTProcessor。