Ответ
OAuth 2.0 — это протокол авторизации, позволяющий стороннему приложению получать ограниченный доступ к защищенным ресурсам пользователя без передачи его учетных данных (логина/пароля).
Основные роли:
- Resource Owner — пользователь, владеющий данными.
- Client — приложение, запрашивающее доступ.
- Authorization Server — сервер, выдающий токены доступа (например, Keycloak, Okta).
- Resource Server — сервер, хранящий защищенные данные (API).
Типы потоков (Grant Types):
- Authorization Code — самый безопасный для веб-приложений. Клиент получает код, а затем обменивает его на токен.
- Client Credentials — для аутентификации между сервисами (M2M). Использует только
client_idиclient_secret. - Resource Owner Password Credentials — для доверенных клиентов (например, официальные мобильные приложения). Не рекомендуется, так как требует передачи пароля.
- Implicit — устарел (RFC 6749) и не рекомендуется к использованию из-за проблем с безопасностью.
Пример конфигурации Client Credentials в Spring Security:
@Bean
public OAuth2AuthorizedClientManager authorizedClientManager(
ClientRegistrationRepository clientRegRepo,
OAuth2AuthorizedClientRepository authClientRepo) {
OAuth2AuthorizedClientProvider provider = OAuth2AuthorizedClientProviderBuilder.builder()
.clientCredentials() // Используем поток "клиентские учетные данные"
.build();
DefaultOAuth2AuthorizedClientManager manager =
new DefaultOAuth2AuthorizedClientManager(clientRegRepo, authClientRepo);
manager.setAuthorizedClientProvider(provider);
return manager;
}
Почему OAuth 2.0? Он отделяет аутентификацию от авторизации, позволяет выдавать ограниченные по времени и scope токены, что безопаснее, чем хранение паролей.