Реализовывали ли вы интеграцию со сторонним API для авторизации (OAuth, OIDC)?

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

Ответ

Да, интегрировал авторизацию через сторонние провайдеры, в основном по протоколам OAuth 2.0 и OpenID Connect (OIDC).

Основные провайдеры: Google, Facebook, VK, Яндекс.ID.

Пример настройки OAuth 2.0 клиента для Google в Spring Boot:

@Configuration
public class OAuth2Config {

    @Bean
    public ClientRegistrationRepository clientRegistrationRepository() {
        return new InMemoryClientRegistrationRepository(
            ClientRegistration.withRegistrationId("google")
                .clientId(System.getenv("GOOGLE_CLIENT_ID"))
                .clientSecret(System.getenv("GOOGLE_CLIENT_SECRET"))
                .scope("openid", "profile", "email") // OIDC scope
                .authorizationUri("https://accounts.google.com/o/oauth2/v2/auth")
                .tokenUri("https://www.googleapis.com/oauth2/v4/token")
                .userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo")
                .clientName("Google")
                .build()
        );
    }
}

Ключевые аспекты реализации:

  1. Безопасность:
    • Валидация redirect_uri для предотвращения подмены.
    • Использование состояния (state parameter) для защиты от CSRF-атак.
    • Безопасное хранение секретов клиента в переменных окружения.
  2. Хранение токенов: Использовал HttpOnly, Secure куки или серверные сессии для хранения refresh/access токенов, избегая localStorage.
  3. JWT (для кастомных API): Реализовывал выдачу и валидацию собственных JWT-токенов, включая подпись (HMAC/RSA) и проверку срока действия (exp).
  4. Обработка ошибок: Корректная обработка случаев отзыва доступа пользователем или истечения срока действия токена.