Ответ
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 токены, что безопаснее, чем хранение паролей.
Ответ 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 — это вообще старый дед, который уже сдох и его вычеркнули из рекомендаций. Забудь, как страшный сон.
А зачем весь этот цирк? Да затем, ёбаный насос! Чтобы аутентификацию (кто ты) от авторизации (на что ты имеешь право) отделить. Чтобы токены были на время, а не вечные. Чтобы если что-то утекло — не вся твоя жизнь пошла под откос. Короче, чтобы не было пиздеца. Всё гениальное — просто, как три копейки, блядь.