Почему Resource Server должен знать client_id в Spring OAuth2? - PullRequest
0 голосов
/ 06 апреля 2019

Я реализую авторизацию OAuth2 с помощью Spring Boot. У меня уже есть Сервер авторизации и Сервер ресурсов, теперь я хочу получить доступ к ресурсам с Сервера ресурсов, используя client_credentials тип предоставления.

Я немного запутался, потому что в Resource Server мне нужно добавить client_id и client_secret. Но зачем Resource Server это нужно?

Как я понимаю, это понятие клиент должен получить от сервера авторизации, используя учетные данные клиента, свой токен доступа. А затем отправьте этот токен доступа на сервер ресурсов без каких-либо учетных данных клиента.

Так зачем же Resource Server также нужны учетные данные клиента? Resource Server и клиент - это две отдельные сущности, я не понимаю, почему Resource Server должен знать о client_id и client_secret.

Почему токена доступа недостаточно для аутентификации? check_token конечная точка может возвращать список ресурсов, к которым можно получить доступ с этим токеном, и если у клиента есть этот токен, это означает, что он уже аутентифицирован с учетными данными клиента для получения этого токена.

Что, если я хочу получить доступ от нескольких разных клиентов к этому серверу ресурсов?

Конфигурация сервера ресурсов:

@Configuration
@RestController
@EnableWebSecurity
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(final HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/**").authenticated()
                .and()
            .httpBasic().disable();
    }

    @Override
    public void configure(ResourceServerSecurityConfigurer resources)  {
        resources
            .resourceId("translate-service");
    }
}

Свойства сервера ресурсов:

security.oauth2.resource.user-info-uri=http://localhost:8090/user
security.oauth2.resource.token-info-uri=http://localhost:8090/oauth/check_token
security.oauth2.client.client-id=XXXX
security.oauth2.client.client-secret=XXXX

Если я не установлю свойства клиента, Spring запишет предупреждение:

Обнаружен нулевой идентификатор клиента или секрет клиента. Конечная точка, которая требует аутентификации, отклонит запрос с ошибкой 401.

А аутентификация не будет работать.

Может, я что-то не так делаю, и есть какое-то решение, чтобы не предоставлять client_id в Resource Server?

1 Ответ

1 голос
/ 06 апреля 2019

Если вы используете RemoteTokenServices, ваш сервер ресурсов также является дополнительным клиентом сервера авторизации, см. Руководство для разработчиков OAuth 2 :

Anальтернативой является RemoteTokenServices, который представляет собой функции Spring OAuth (не входит в спецификацию), позволяющие серверам ресурсов декодировать токены через HTTP-ресурс на сервере авторизации (/oauth/check_token).RemoteTokenServices удобно, если на Ресурс-серверах нет большого объема трафика (каждый запрос должен проверяться сервером авторизации) или если вы можете позволить себе кэшировать результаты.Чтобы использовать конечную точку /oauth/check_token, необходимо предоставить ее, изменив правило доступа (по умолчанию «denyAll ()») в AuthorizationServerSecurityConfigurer, например,

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
    oauthServer.tokenKeyAccess("isAnonymous() || hasAuthority('ROLE_TRUSTED_CLIENT')").checkTokenAccess(
        "hasAuthority('ROLE_TRUSTED_CLIENT')");
}

В этом примере мы настраиваем обаКонечная точка /oauth/check_token и конечная точка /oauth/token_key (поэтому доверенные ресурсы могут получить открытый ключ для проверки JWT).Эти две конечные точки защищены базовой аутентификацией HTTP с использованием учетных данных клиента.

и Загрузка OAuth2 :

2.4 Как настроить токенКонечная точка информации

Конечная точка информации о токене, также иногда называемая конечной точкой интроспекции, вероятно, требует некоторой аутентификации клиента, либо базовой, либо переносимой.Вообще говоря, токен на предъявителя в SecurityContext не будет достаточным, поскольку он привязан к пользователю.Вместо этого вам нужно будет указать учетные данные, которые представляют этот клиент, например:

spring:
  security:
    oauth2:
      client:
        clientId: client-id
        clientSecret: client-secret
      resource:
        tokenInfoUri: https://issuer/oauth2/check_token

По умолчанию при этом будет использоваться обычная проверка подлинности с использованием настроенных учетных данных для проверки подлинности в конечной точке информации токена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...