Что такое OAuth 2.0 и какие типы потоков (grant types) он поддерживает?

«Что такое OAuth 2.0 и какие типы потоков (grant types) он поддерживает?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

OAuth 2.0 — это протокол авторизации, позволяющий стороннему приложению получать ограниченный доступ к защищенным ресурсам пользователя без передачи его учетных данных (логина/пароля).

Основные роли:

  1. Resource Owner — пользователь, владеющий данными.
  2. Client — приложение, запрашивающее доступ.
  3. Authorization Server — сервер, выдающий токены доступа (например, Keycloak, Okta).
  4. 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 токены, что безопаснее, чем хранение паролей.