Ответ
OAuth 2.0 — это открытый стандартный протокол авторизации, который позволяет стороннему приложению (клиенту) получать ограниченный доступ к защищенным ресурсам пользователя (например, к API) на другом сервисе (провайдере), не раскрывая пароль пользователя клиенту.
Основные роли в потоке OAuth 2.0:
- Владелец ресурса (Resource Owner): Пользователь, чьи данные защищены.
- Клиент (Client): Приложение, которое запрашивает доступ к данным.
- Сервер авторизации (Authorization Server): Сервер провайдера, который аутентифицирует пользователя, выдает токены доступа (Access Token) и, опционально, токены обновления (Refresh Token).
- Сервер ресурсов (Resource Server): API провайдера, которое хранит защищенные данные и принимает токены доступа для их предоставления.
Типичный поток Authorization Code (наиболее безопасный для веб-приложений):
- Клиент перенаправляет пользователя на сервер авторизации.
- Пользователь аутентифицируется и дает согласие на запрашиваемые права (
scope). - Сервер авторизации перенаправляет пользователя обратно на клиент с кодом авторизации в URL.
- Клиент обменивает код авторизации на токен доступа, выполнив запрос напрямую к серверу авторизации (с использованием своего
client_secret). - Клиент использует токен доступа для вызовов 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: Используется для получения нового токена доступа по истечении срока действия старого без повторного участия пользователя.