OAuth 2.0 авторизация
Открытый стандарт авторизации (RFC 6749, 2012), позволяющий приложениям получать делегированный доступ к API без передачи пользовательского пароля.
Определение OAuth 2.0
OAuth 2.0 — открытый стандарт авторизации, опубликованный в 2012 году как RFC 6749. Он позволяет приложению получить доступ к ресурсам пользователя на другом сервисе, не требуя передавать пароль. За этим стоит каждое «Войти через Google» или «Войти через VK»: сервис получает не пароль, а короткоживущий JWT-токен доступа с ограниченным набором прав — scope. Скомпрометированный токен отзывается мгновенно, пароль при этом не меняется.
Authorization Code Flow
Основной поток для серверных приложений работает в четыре шага:
- Браузер уходит на страницу авторизации провайдера с параметрами
client_id,redirect_uriиscope. - Пользователь вводит пароль и даёт согласие — провайдер возвращает одноразовый код авторизации на
redirect_uri. - Сервер приложения обменивает код на пару:
access_token(минуты–часы) +refresh_token(дни–месяцы). - Все запросы к API идут с заголовком
Authorization: Bearer <access_token>.
Пароль ни разу не покидает страницы провайдера. Для мобильных приложений и SPA, где нельзя хранить client_secret, стандарт дополнен PKCE (RFC 7636) — защитой от перехвата кода посредником.
QR-авторизация: Device Authorization Grant
WhatsApp Web, Telegram Web и Госуслуги применяют OAuth-поток для устройств — Device Authorization Grant (RFC 8628). Мобильный телефон здесь выступает авторизационным сервером для браузера-гостя.
- Браузер получает временный токен-сессии и рендерит его в QR-код.
- Пользователь сканирует QR уже авторизованным приложением на телефоне.
- Приложение подтверждает серверу: «эта браузерная сессия принадлежит мне».
- Сервер выдаёт браузеру access-токен и вход завершён.
QR здесь — канал передачи одноразового кода между двумя устройствами. Код живёт секунды, брутфорс бессмысленен. Telegram и WhatsApp дополнительно присылают уведомление о новой сессии с IP и браузером — чтобы пользователь мог немедленно её отозвать.
Частые вопросы
Чем OAuth 2.0 отличается от обычной авторизации по паролю?
Приложение получает не пароль, а токен — ограниченный по времени и по правам. Скомпрометированный токен отзывается без смены пароля. OAuth также позволяет давать частичный доступ: например, только чтение календаря, но не почту.
Что такое scope в OAuth?
Scope — список разрешений, которые приложение запрашивает. Например, openid email profile для базовых данных аккаунта или https://www.googleapis.com/auth/calendar.readonly для чтения календаря Google. Пользователь видит список на экране согласия и может отказать в части прав.
Безопасен ли QR-вход по сравнению с паролем?
Как правило, безопаснее: QR содержит одноразовый токен, действующий секунды. Его нельзя подобрать брутфорсом. Основной риск — фишинг: если пользователя обманом заставить отсканировать чужой QR, злоумышленник получит сессию. Поэтому Telegram и WhatsApp сразу присылают пуш с деталями новой сессии.
Зачем нужен refresh_token, если есть access_token?
Access-токен намеренно короткоживущий (15 минут — 1 час): если утечёт, окно атаки мало. Refresh-токен живёт дольше и хранится на сервере. Когда access истекает, сервер обменивает refresh на новую пару без участия пользователя. Отозвать refresh — значит выкинуть пользователя из системы.
Что такое PKCE и когда он нужен?
PKCE (Proof Key for Code Exchange, RFC 7636) — расширение для SPA и мобильных приложений, где нельзя безопасно хранить client_secret. Клиент генерирует code_verifier, хэширует его в code_challenge и отправляет при старте флоу. Сервер проверяет, что код обменивает тот же клиент, который его запросил — это закрывает атаку перехватом authorization code.