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