spring-boot - Spring Boot + JWT:应根据身份验证服务器检查令牌
问题描述
据我了解,JWT 包含标头、有效负载和签名。
签名通过使用秘密加密标头和有效负载来确保 JWT 完整性。
因此,如果身份验证(令牌)服务器和资源服务器共享相同的秘密,则资源服务器应该能够自己验证令牌,这就是这些令牌的目的。
因此,我有两个问题:
- 为什么 Spring 提供了一个
RemoteTokenServices
,不是一个反模式吗?
[编辑]我自己回答了这个:
事实上,使用 JWT 而不检查令牌存储的主要问题是我们无法撤销它们。仅使用签名来检查其真实性,任何令牌在过期之前都保持有效。
根据令牌存储检查 JWT 允许我们撤销令牌,在这种情况下,将不会接受已被撤销的有效 JWT 来验证请求。
因此,唯一可以安全使用自认证 JWT 的情况是到期时间非常短。
- 如果我不使用此服务,如何仅使用密钥在本地实现令牌验证?
我当前咨询远程令牌服务的资源服务器配置:
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Profile("!test")
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Value("${auth-server.url}")
private String authEndpoint;
@Value("${security.oauth2.client.client-id}")
private String clientId;
@Value("${security.oauth2.client.client-secret}")
private String clientSecret;
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("ms/legacy");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll().and().cors().disable().csrf().disable().httpBasic().disable()
.exceptionHandling()
.authenticationEntryPoint(
(request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED))
.accessDeniedHandler(
(request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED));
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("ms/legacy");
}
@Bean
public ResourceServerTokenServices tokenService() {
RemoteTokenServices tokenServices = new RemoteTokenServices();
tokenServices.setClientId(clientId);
tokenServices.setClientSecret(clientSecret);
tokenServices.setCheckTokenEndpointUrl(authEndpoint + "/uaa/oauth/check_token");
return tokenServices;
}
}
解决方案
- 为什么Spring提供了RemoteTokenServices,不是反模式吗?
Spring 是一个灵活的框架,它将为您提供不同的实现,它让您可以选择最适合您需要的实现。
- 如果我不使用此服务,如何仅使用密钥在本地实现令牌验证?
本地令牌验证:
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer config) {
config.tokenServices(tokenServices());
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("123");
return converter;
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
return defaultTokenServices;
}
}
推荐阅读
- python - 如何用 seaborn 绘制阴影误差带?
- .net-core - MassTransit AzureServieBus InvalidOperationException
- sql - SQL拆分消费满月
- c++ - 为什么 gcc 对包含标头比 clang 更严格
- flutter - 在 Widget 的 deactivate 方法中使用 provider 方法
- sql - 如何撤消 PostgreSQL 中的更改
- mysql - vue端无法显示express res.send()自定义错误信息
- powershell - Powershell remove-item 不会删除文件
- mysql - MySql 代码用于在两个表中返回特定日期的值,然后找到两者的差异
- travis-ci - 从特定分支上的所有构建下载原始构建日志