Я реализую авторизацию 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?