J'utilise OAuth 2.0
avec spring pour la génération de jetons et je veux définir expire_in
manuellement afin que le jeton puisse expirer selon mes critères. Quelqu'un m'aider?
Voici ma réponse:
{
access_token: "c7a6cb95-1506-40e7-87d1-ddef0a239f64"
token_type: "bearer"
expires_in: 43199
scope: "read"
}
Il peut être défini avec un ClientBuilder
obtenu à partir d'un ClientDetailsServiceConfigurer
.
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client")
.secret("secret")
.authorizedGrantTypes("authorization_code", "refresh_token", "password")
.scopes("app")
.accessTokenValiditySeconds(30);
}
// ... additional configuration
}
ou directement sur DefaultTokenServices
en fonction de vos besoins.
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
// optionally here you could just get endpoints.getConsumerTokenService()
// and cast to DefaultTokenServices and just set values needed
DefaultTokenServices tokenServices = new DefaultTokenServices();
tokenServices.setTokenStore(endpoints.getTokenStore());
tokenServices.setSupportRefreshToken(true);
tokenServices.setClientDetailsService(endpoints.getClientDetailsService());
tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer());
tokenServices.setAccessTokenValiditySeconds(60);
endpoints.tokenServices(tokenServices);
}
}
configurez votre configuration oauth en changeant vos Bean TokenServices et en définissant accessTokenValiditySeconds property:
<bean id="tokenServices"
class="org.springframework.security.oauth2.provider.token.DefaultTokenServices">
<property name="accessTokenValiditySeconds" value="1" />
<property name="tokenStore" ref="tokenStore" />
<property name="supportRefreshToken" value="true" />
<property name="clientDetailsService" ref="clientDetails" />
</bean>
Vous pouvez également configurer DefaultTokenServices
dans le fichier application.yaml
.
security:
oauth2:
client:
clientId: client-id
clientSecret: client-secret
authorized-grant-types: authorization_code,refresh_token,password
scope: openid
access-token-validity-seconds: 30
Créez une classe personnalisée de AuthorizationCodeAccessTokenProvider et remplacez le parent
public method obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest request)
Dans la méthode substituée de votre classe personnalisée, appelez la logique de programme de sa classe parente:
DefaultOAuth2AccessToken token = super.obtainAccessToken(details, request);
Cela retournera un AccessToken . Maintenant, il vous suffit de manipuler directement la valeur expirée de ce jeton, en fournissant un horodatage du passé token.setExpiresIn(int timestamp)
Si vous utilisez le fournisseur oauth2 security de Grails.__, vous ne pouvez modifier que grails-app/conf/spring/resources.groovy
import org.springframework.security.oauth2.provider.token.DefaultTokenServices
// Place your Spring DSL code here
beans = {
tokenServices(DefaultTokenServices){
accessTokenValiditySeconds = 600;
tokenStore = ref('tokenStore')
supportRefreshToken = true;
clientDetailsService = ref('clientDetailsService')
}
}