如何在Spring + Java

时间:2019-06-25 09:58:45

标签: spring-security oauth oauth-2.0 spring-security-oauth2 spring-oauth2

我遇到一种情况,授权服务器没有向令牌响应返回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;
}

2 个答案:

答案 0 :(得分:1)

我知道这是一个老问题,但是也许有人需要重写DefaultOAuth2AccessToken项目下spring security oauth2 autoconfigure的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);
  }

}

希望这会有所帮助。

答案 1 :(得分:0)

您可以注册DefaultTokenServices Bean并对其进行配置:

    @Bean
    @Primary
    public DefaultTokenServices tokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setAccessTokenValiditySeconds(3600); // valid for one hour
        return defaultTokenServices;
    }