如何在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访问令牌的到期时间的主要内容,如果未能解决你的问题,请参考以下文章

如何附加到覆盖的 YAML 文件(Spring)中的数组?

Java精品项目系统源码第108期OA办公管理系统

运行 Spring Boot fat-jar 时如何覆盖 Java 资源?

OA学习笔记-006-SPRING2.5与hibernate3.5整合

一款基于 Spring Boot 开发的 OA 项目,接私活必备!

一款基于 Spring Boot 开发的 OA 项目,接私活必备!