web-dev-qa-db-fra.com

Spring Security OAuth2 check_token point de terminaison

J'essaie de configurer un serveur de ressources pour qu'il fonctionne avec un serveur d'autorisation séparé à l'aide de Spring Security oauth. J'utilise RemoteTokenServices qui nécessite /check_token endpoint. 

Je pouvais voir que /oauth/check_token endpoint est activé par défaut lorsque @EnableAuthorizationServer est utilisé. Cependant, le terminal n'est pas accessible par défaut. 

L'entrée suivante doit-elle être ajoutée manuellement à la liste blanche de ce noeud final?

http.authorizeRequests().antMatchers("/oauth/check_token").permitAll();

Cela rendra ce point final accessible à tous. Est-ce le comportement souhaité? Ou suis-je manque quelque chose. 

Merci d'avance, 

12
sowdri

Vous devez 

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
{
   oauthServer.checkTokenAccess("permitAll()");    
}

Pour plus d'informations à ce sujet ::

Comment utiliser RemoteTokenService?

19
Pratik Shah

Juste pour clarifier quelques points et ajouter quelques informations à la réponse fournie par Pratik Shah (et par Alex dans le fil de discussion associé):

1- La méthode configure mentionnée est remplacée par la création d'une classe qui étend AuthorizationServerConfigurerAdapter:

@EnableAuthorizationServer
@Configuration
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
        oauthServer.tokenKeyAccess("permitAll()")
            .checkTokenAccess("isAuthenticated()");
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws     Exception {
        clients
                .inMemory()
                .withClient("ger-client-id")
                .secret("ger-secret")
                .authorizedGrantTypes("password")
                .scopes("read", "write");
    }
}

`` `

2- Je suggère de lire ce guide Spring / d’expliquer la configuration automatique effectuée par Spring Boot lorsque nous incluons l’annotation @EnableAuthorizationServer, y compris un bean AuthorizationServerConfigurer. Si vous créez un bean de configuration qui étend la AuthorizationServerConfigurerAdapter comme je l’ai fait ci-dessus, alors toute la configuration automatique est désactivée.

3- Si la configuration automatique vous convient parfaitement et que vous souhaitez simplement manipuler l'accès au noeud final /oauth/check_token, vous pouvez toujours le faire sans créer de bean AuthorizationServerConfigurer (et donc sans avoir à tout configurer par programme).

Vous devrez ajouter la propriété security.oauth2.authorization.check-token-access au fichier application.properties, par exemple:

security.oauth2.client.client-id=ger-client-id
security.oauth2.client.client-secret=ger-secret
security.oauth2.client.scope=read,write

security.oauth2.authorization.check-token-access=permitAll()

Bien sûr, vous pouvez lui attribuer une valeur isAuthenticated() si vous préférez.

Vous pouvez définir le niveau de journalisation sur DEBUG pour vérifier que tout est configuré comme prévu:

16:16:42.763 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll()', for Ant [pattern='/oauth/check_token']

Il n'y a pas beaucoup de documentation sur ces propriétés, mais vous pouvez les comprendre à partir de cette classe d'autoconfiguration .

Une dernière chose à noter, je viens de soumettre un problème dans le printemps-security-oauth projet; il semble que la fonctionnalité token_check soit activée par défaut si vous ajoutez une barre oblique finale à la demande:

$ curl localhost:8080/oauth/check_token/?token=fc9e4ad4-d6e8-4f57-b67e-c0285dcdeb58
{"scope":["read","write"],"active":true,"exp":1544940147,"authorities":["ROLE_USER"],"client_id":"ger-client-id"}
1
Gerardo Roza

Tout d'abord, l'expression d'accès au jeton de configuration:

@Override
public void configure(AuthorizationServerSecurityConfigurer securityConfigurer) throws Exception {
    securityConfigurer
            .allowFormAuthenticationForClients()
            .checkTokenAccess("isAuthenticated()")
            .addTokenEndpointAuthenticationFilter(checkTokenEndpointFilter());
}

Ensuite, nous devons définir un filtre pour traiter l’authentification du client:

@Bean
public ClientCredentialsTokenEndpointFilter checkTokenEndpointFilter() {
    ClientCredentialsTokenEndpointFilter filter = new ClientCredentialsTokenEndpointFilter("/oauth/check_token");
    filter.setAuthenticationManager(authenticationManager);
    filter.setAllowOnlyPost(true);
    return filter;
}
0
smartwjw