如何在spring + java中添加(覆盖)oAuth2访问令牌的到期时间
Posted
技术标签:
【中文标题】如何在spring + java中添加(覆盖)oAuth2访问令牌的到期时间【英文标题】:How to add(overwrite) expiry time for oAuth2 access token in spring + java 【发布时间】:2019-11-07 03:15:48 【问题描述】:我有一种情况,授权服务器没有将expires_in
字段返回到令牌响应,但令牌在一定时间后过期。我可以在代码中的某处手动设置吗?
下面是我的 ROPC 代码。
@Bean(name = “myROPCRestTemplate")
public OAuth2RestTemplate myROPCRestTemplate()
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(myPasswordResourceDetails());
restTemplate.setAccessTokenProvider(getAccessTokenProvider());
return restTemplate;
private AccessTokenProvider getAccessTokenProvider()
ResourceOwnerPasswordAccessTokenProvider resourceOwnerPasswordAccessTokenProvider = new ResourceOwnerPasswordAccessTokenProvider();
return new AccessTokenProviderChain(Collections.singletonList(resourceOwnerPasswordAccessTokenProvider));
private OAuth2ProtectedResourceDetails myPasswordResourceDetails()
ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();
resource.setAccessTokenUri(tokenUrl);
resource.setClientId(clientId);
resource.setClientSecret(clientSecret);
resource.setUsername(username);
resource.setPassword(password);
resource.setClientAuthenticationScheme(AuthenticationScheme.form);
resource.setGrantType("password");
return resource;
【问题讨论】:
设置它不会改变你知道的过期时间 我的问题是,身份验证服务器的响应没有过期时间。因此,该框架认为它没有到期。但是令牌会在 24 小时后过期。 【参考方案1】:我知道这是一个老问题,但也许有人需要覆盖 DefaultOAuth2AccessToken 项目下 DefaultOAuth2AccessToken 的 AccessToken 实现,这是我们使用的一种解决方法 我们的方法不是使用OAuth2AccessToken 扩展默认访问令牌或从头开始覆盖新的访问令牌,而是创建扩展DefaultOAuth2ClientContext 的ClientContext 并在设置操作期间对相同的AccessToken 进行必要的更改。 这是代码示例,首先扩展客户端上下文,创建一个新组件并在 setAccessToken 中进行必要的更改(在这种情况下设置 exiparation):
@Component
public class MyOAuth2ClientContext extends DefaultOAuth2ClientContext
@Override
public void setAccessToken(OAuth2AccessToken accessToken)
DefaultOAuth2AccessToken dxpAccessToken = new DefaultOAuth2AccessToken(accessToken);
dxpAccessToken.setExpiration(new Date());
super.setAccessToken(dxpAccessToken);
最后在构造 OAuth2RestTemplate 时使用这个上下文,使用你自己的上下文:
@Configuration
public class MyWebConfiguration
@Resource MyOAuth2ClientContext myOAuth2ClientContext;
@Bean
@ConfigurationProperties("spring.security.oauth2.client.authserver")
protected ClientCredentialsResourceDetails authServerDetails()
return new ClientCredentialsResourceDetails();
@Bean(name = "myRestTemplate")
protected RestTemplate myRestTemplate()
return new OAuth2RestTemplate(authServerDetails(), myOAuth2ClientContext);
希望这会有所帮助。
【讨论】:
【参考方案2】:您可以注册一个 DefaultTokenServices bean 并对其进行配置:
@Bean
@Primary
public DefaultTokenServices tokenServices()
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setAccessTokenValiditySeconds(3600); // valid for one hour
return defaultTokenServices;
【讨论】:
以上是关于如何在spring + java中添加(覆盖)oAuth2访问令牌的到期时间的主要内容,如果未能解决你的问题,请参考以下文章
运行 Spring Boot fat-jar 时如何覆盖 Java 资源?
OA学习笔记-006-SPRING2.5与hibernate3.5整合