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

Ответ

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 токены, что безопаснее, чем хранение паролей.

Ответ 18+ 🔞

Давай разжую тебе эту тему про OAuth 2.0, а то я вижу, у тебя глаза уже стекленеют, как у совы нахуй. Сидишь и думаешь: «Опять эти ваши протоколы, блядь».

Смотри сюда. Представь, что у тебя есть квартира (это твои данные, Resource Owner). И вот приходит какой-то чувак (Client), допустим, сантехник, и говорит: «Дай доступ к крану, я тебе починю». Ты же не отдаёшь ему все ключи, паспорт и банковскую карту, ёпта? Нет! Ты идешь в ДЕЗ (Authorization Server), типа Keycloak или Okta, и получаешь у них одноразовый пропуск (токен) именно к крану, а не ко всему шкафу с твоим бельём.

А потом с этим пропуском сантехник идёт уже в саму квартиру (Resource Server), где живёт твой кран (твой API), и делает своё дело. Вот и вся магия, блядь. Безопасно, потому что пароль свой ты никому не светишь.

А теперь про эти самые «потоки», или Grant Types. Их, блядь, как собак нерезаных, но главные вот:

  • Authorization Code — это когда ты через окошко (браузер) получаешь бумажку-код, а потом в сторонке меняешь её на настоящий пропуск. Для веба — самое то, безопасняк.
  • Client Credentials — это когда два сервиса между собой договариваются, как два робота, блядь. Никаких пользователей, чисто client_id и client_secret. Вот, глянь, как это в Spring выглядит, не пугайся:
@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;
}
  • Resource Owner Password Credentials — это когда ты, мудак, всё-таки отдаёшь свой логин и пароль какому-то приложению. Типа, «я тебе доверяю, родной». Делать так — это как давать ключи от квартиры первому встречному алкашу у подъезда. Не рекомендую, нахуй.
  • Implicit — это вообще старый дед, который уже сдох и его вычеркнули из рекомендаций. Забудь, как страшный сон.

А зачем весь этот цирк? Да затем, ёбаный насос! Чтобы аутентификацию (кто ты) от авторизации (на что ты имеешь право) отделить. Чтобы токены были на время, а не вечные. Чтобы если что-то утекло — не вся твоя жизнь пошла под откос. Короче, чтобы не было пиздеца. Всё гениальное — просто, как три копейки, блядь.