Что такое OAuth 2.0 и для чего он используется?

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

Ответ

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

Основные роли в потоке OAuth 2.0:

  1. Владелец ресурса (Resource Owner): Пользователь, чьи данные защищены.
  2. Клиент (Client): Приложение, которое запрашивает доступ к данным.
  3. Сервер авторизации (Authorization Server): Сервер провайдера, который аутентифицирует пользователя, выдает токены доступа (Access Token) и, опционально, токены обновления (Refresh Token).
  4. Сервер ресурсов (Resource Server): API провайдера, которое хранит защищенные данные и принимает токены доступа для их предоставления.

Типичный поток Authorization Code (наиболее безопасный для веб-приложений):

  1. Клиент перенаправляет пользователя на сервер авторизации.
  2. Пользователь аутентифицируется и дает согласие на запрашиваемые права (scope).
  3. Сервер авторизации перенаправляет пользователя обратно на клиент с кодом авторизации в URL.
  4. Клиент обменивает код авторизации на токен доступа, выполнив запрос напрямую к серверу авторизации (с использованием своего client_secret).
  5. Клиент использует токен доступа для вызовов API сервера ресурсов.

Пример URL для запроса авторизации (шаг 1):

https://auth.provider.com/authorize?
  response_type=code&
  client_id=YOUR_CLIENT_ID&
  redirect_uri=https://your-app.com/callback&
  scope=read:profile email&
  state=random_string_for_csrf

Основные типы предоставления прав (Grant Types):

  • Authorization Code: Для серверных веб-приложений. Наиболее безопасный, так как токен не передается через браузер.
  • Implicit (устаревший): Для одностраничных приложений (SPA). Токен возвращается напрямую в фрагменте URL. Не рекомендуется в новых реализациях (используйте Authorization Code Flow with PKCE).
  • Client Credentials: Для аутентификации между сервисами (machine-to-machine), где нет конкретного пользователя.
  • Resource Owner Password Credentials (не рекомендуется): Клиент получает логин/пароль пользователя. Используется только для доверенных приложений (например, официальных клиентов).
  • Refresh Token Flow: Используется для получения нового токена доступа по истечении срока действия старого без повторного участия пользователя.