Spring Безопасность OAuth2 check_token конечная точка

Я пытаюсь настроить сервер ресурсов для работы с отдельным сервером авторизации с помощью spring security oauth. Я использую RemoteTokenServices, для которого требуется конечная точка /check_token.

Я мог видеть, что конечная точка /oauth/check_token включена по умолчанию, когда используется @EnableAuthorizationServer. Однако конечная точка недоступна по умолчанию.

Должна ли добавляться следующая запись в белый список этой конечной точки?

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

Это сделает эту конечную точку доступной для всех, является ли это желаемым поведением? Или я что-то упускаю.

Спасибо заранее,

Ответ 1

Вы должны

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

Для получения дополнительной информации об этом::

Как использовать RemoteTokenService?

Ответ 2

Просто чтобы прояснить пару моментов и добавить дополнительную информацию к ответу, предоставленному Пратиком Шахом (и Алексом в соответствующей теме):

1- Упомянутый метод configure переопределяется созданием класса, расширяющего 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- Я предлагаю прочитать это руководство по Spring, объясняющее автоматическую настройку, выполняемую Spring Boot, когда мы включаем аннотацию @EnableAuthorizationServer, включая bean-компонент AuthorizationServerConfigurer. Если вы создаете bean-компонент конфигурации, расширяющий AuthorizationServerConfigurerAdapter, как я делал выше, вся эта автоматическая конфигурация отключается.

3- Если автоматическая конфигурация вам подходит, и вы ПРОСТО ХОТИТЕ манипулировать доступом к конечной точке /oauth/check_token, вы все равно можете сделать это без создания bean-компонента AuthorizationServerConfigurer (и, следовательно, без необходимости конфигурировать все программно).

Вам нужно добавить свойство security.oauth2.authorization.check-token-access в файл application.properties, например:

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()

Конечно, вы можете присвоить ему значение isAuthenticated(), если хотите.

Вы можете установить уровень журнала DEBUG, чтобы убедиться, что все настроено должным образом:

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']

Об этих свойствах не так много документации, но их можно выяснить из этого класса автоконфигурации.

Еще одна вещь, о которой стоит упомянуть, хотя, похоже, это исправлено в последних версиях Spring, я только что представил проблему в проекте spring-security-oauth; кажется, что функция token_check включена по умолчанию, если вы добавляете косую черту в запрос:

$ 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"}

Ответ 3

Во-первых, выражение доступа к токенам конфигурации:

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

Затем нам нужно определить фильтр для обработки аутентификации клиента:

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