QRkoder

OAuth 2.0 авторизация

Открытый стандарт авторизации (RFC 6749, 2012), позволяющий приложениям получать делегированный доступ к API без передачи пользовательского пароля.

Определение OAuth 2.0

OAuth 2.0 — открытый стандарт авторизации, опубликованный в 2012 году как RFC 6749. Он позволяет приложению получить доступ к ресурсам пользователя на другом сервисе, не требуя передавать пароль. За этим стоит каждое «Войти через Google» или «Войти через VK»: сервис получает не пароль, а короткоживущий JWT-токен доступа с ограниченным набором прав — scope. Скомпрометированный токен отзывается мгновенно, пароль при этом не меняется.

Authorization Code Flow

Основной поток для серверных приложений работает в четыре шага:

  1. Браузер уходит на страницу авторизации провайдера с параметрами client_id, redirect_uri и scope.
  2. Пользователь вводит пароль и даёт согласие — провайдер возвращает одноразовый код авторизации на redirect_uri.
  3. Сервер приложения обменивает код на пару: access_token (минуты–часы) + refresh_token (дни–месяцы).
  4. Все запросы к 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). Мобильный телефон здесь выступает авторизационным сервером для браузера-гостя.

  1. Браузер получает временный токен-сессии и рендерит его в QR-код.
  2. Пользователь сканирует QR уже авторизованным приложением на телефоне.
  3. Приложение подтверждает серверу: «эта браузерная сессия принадлежит мне».
  4. Сервер выдаёт браузеру 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.

Создавайте QR-коды бесплатно

Динамические QR-коды с аналитикой, дизайном и без ограничений по сканированиям.

Начать бесплатно