OAuth
OAuth — это открытый протокол авторизации, позволяющий предоставить стороннему приложению или веб-сервису ограниченный доступ к ресурсам пользователя (например, к фотографиям, списку контактов или данным профиля) без передачи ему логина и пароля. Вместо этого протокол использует выдачу токенов доступа, которые определяют права и объём разрешённых действий. OAuth не является протоколом аутентификации (подтверждения личности), хотя часто используется в связке с ней. Наиболее распространённой версией является OAuth 2.0, которая лежит в основе систем «Войти через...» (Single Sign-On) для большинства современных интернет-сервисов.
История
Протокол OAuth был разработан в 2006–2007 годах группой разработчиков Twitter (ныне X), Google и других компаний, столкнувшихся с проблемой безопасного делегирования доступа. Первая версия (OAuth 1.0) была опубликована в декабре 2007 года как запрос комментариев (RFC 5849). Она требовала сложной криптографической подписи каждого запроса, что усложняло реализацию для разработчиков.
В 2010 году началась работа над второй версией (OAuth 2.0), которая была стандартизирована в октябре 2012 года в документе RFC 6749. OAuth 2.0 отказался от обязательной подписи запросов, перейдя на использование HTTPS для защиты каналов связи, и ввёл более гибкую систему типов токенов и потоков авторизации. Это сделало протокол проще в реализации, но потребовало от разработчиков строгого соблюдения мер безопасности, так как компрометация токена могла привести к утечке данных.
Основные понятия
Для понимания работы OAuth необходимо определить ключевые роли и объекты, участвующие в процессе авторизации:
- Владелец ресурса (Resource Owner) — пользователь, который владеет данными и даёт разрешение на доступ к ним.
- Клиент (Client) — приложение (веб-сайт, мобильное приложение, серверный сервис), которое запрашивает доступ к ресурсам пользователя.
- Сервер авторизации (Authorization Server) — сервер, который аутентифицирует владельца ресурса и выдаёт токены доступа после получения разрешения.
- Сервер ресурсов (Resource Server) — сервер, на котором хранятся защищённые данные (например, API социальной сети). Он принимает запросы с токенами доступа и предоставляет данные, если токен действителен.
- Токен доступа (Access Token) — строка символов, представляющая собой разрешение, выданное клиенту. Токен содержит информацию о правах доступа (scope) и сроке действия.
- Токен обновления (Refresh Token) — опциональный токен, используемый для получения нового токена доступа после истечения срока действия старого, без повторного прохождения авторизации пользователем.
Потоки авторизации (Grant Types)
OAuth 2.0 определяет несколько типов потоков авторизации, которые выбираются в зависимости от типа клиента и требований безопасности. Основные из них:
Авторизационный код (Authorization Code)
Наиболее безопасный и распространённый поток, предназначенный для серверных приложений (веб-сайтов). Процесс включает:
- Клиент перенаправляет пользователя на сервер авторизации с указанием запрашиваемых прав (scope).
- Пользователь аутентифицируется на сервере авторизации и даёт согласие на доступ.
- Сервер авторизации перенаправляет пользователя обратно на клиент с временным кодом авторизации.
- Клиент отправляет этот код серверу авторизации по защищённому каналу (с подтверждением своей подлинности через client_secret) и получает токен доступа (и, опционально, токен обновления).
Этот поток считается безопасным, так как токен никогда не передаётся через браузер пользователя, а код авторизации — одноразовый и короткоживущий.
Неявный поток (Implicit Grant)
Упрощённый поток, предназначенный для публичных клиентов (например, одностраничных приложений на JavaScript, работающих в браузере). В этом потоке токен доступа выдаётся непосредственно в URL-перенаправлении после авторизации пользователя. Из-за повышенного риска перехвата токена (через логи браузера, рефереры) этот поток считается менее безопасным и в современных рекомендациях (RFC 8252) заменяется на поток авторизационного кода с использованием PKCE.
Поток с паролем владельца ресурса (Resource Owner Password Credentials Grant)
Поток, при котором клиент напрямую запрашивает у пользователя логин и пароль и передаёт их серверу авторизации для получения токена. Используется только в доверенных приложениях (например, официальное мобильное приложение сервиса), где нет возможности перенаправления на веб-страницу. Из-за высокой степени доверия к клиенту и риска компрометации пароля этот поток не рекомендуется для сторонних приложений.
Поток с учётными данными клиента (Client Credentials Grant)
Используется, когда клиент запрашивает доступ к ресурсам от своего имени, а не от имени пользователя (например, серверное приложение, которое обращается к API для получения списка своих же данных). В этом потоке клиент аутентифицируется сам (через client_id и client_secret) и получает токен без участия пользователя.
Поток с кодом подтверждения для PKCE (Proof Key for Code Exchange)
Расширение для потока авторизационного кода, предназначенное для публичных клиентов (например, мобильных приложений). Вместо client_secret клиент генерирует криптографический ключ (code_verifier) и передаёт его хеш (code_challenge) на сервер авторизации. При обмене кода на токен клиент предоставляет оригинальный ключ, что предотвращает атаки перехвата кода авторизации.
Токены и их использование
Токен доступа — это ключевой элемент OAuth. Он может быть представлен в различных форматах:
- Непрозрачный токен — строка символов, не несущая смысловой нагрузки. Сервер ресурсов хранит соответствие токена правам доступа в своей базе данных.
- JWT (JSON Web Token) — токен, содержащий в себе структурированную информацию (claims) в формате JSON, подписанную цифровой подписью. Сервер ресурсов может проверить подпись и извлечь права доступа из самого токена без обращения к серверу авторизации.
Токены имеют ограниченный срок действия (обычно от нескольких минут до нескольких часов). После истечения срока действия клиент может использовать токен обновления (если он был выдан) для получения нового токена доступа без повторного взаимодействия с пользователем. Токен обновления, как правило, имеет длительный срок жизни (дни или месяцы) и может быть отозван сервером авторизации в любой момент.
Применение
OAuth 2.0 является стандартом де-факто для децентрализованной авторизации в интернете. Основные области применения:
- Single Sign-On (SSO) — возможность входа на множество сайтов через единую учётную запись (например, «Войти через Google», «Войти через VK», «Войти через Яндекс»). При этом сторонний сайт получает только те данные, на которые пользователь дал согласие (например, имя и email), но не пароль.
- Доступ к API — мобильные приложения, веб-сервисы и серверные интеграции используют OAuth для получения доступа к данным пользователя в социальных сетях, облачных хранилищах, платёжных системах и других сервисах.
- Автоматизация и интеграция — сервисы вроде Zapier, IFTTT и корпоративные системы используют OAuth для подключения к различным аккаунтам и выполнения действий от имени пользователя (например, публикация поста в соцсеть или создание задачи в CRM).
- Интернет вещей (IoT) — устройства с ограниченными ресурсами могут использовать OAuth для получения токенов доступа к облачным платформам.
Безопасность и критика
Несмотря на широкое распространение, OAuth 2.0 имеет ряд уязвимостей, связанных с неправильной реализацией:
- Подмена авторизационного кода — атака, при которой злоумышленник перехватывает код авторизации и обменивает его на токен доступа. PKCE был разработан для защиты от этой атаки.
- CSRF (Cross-Site Request Forgery) — атака, при которой злоумышленник заставляет браузер пользователя выполнить нежелательное действие на сайте, где пользователь аутентифицирован. Для защиты используется параметр state в запросах.
- Утечка токенов — токены, передаваемые через URL (в неявном потоке), могут быть перехвачены через рефереры, логи прокси-серверов или историю браузера.
- Отсутствие обязательного шифрования — OAuth 2.0 полагается на HTTPS для защиты каналов связи, но если HTTPS настроен неправильно или используется HTTP, токены могут быть перехвачены.
Критики также отмечают, что OAuth 2.0 является скорее фреймворком, чем строгим протоколом, что приводит к различиям в реализации у разных провайдеров и усложняет разработку универсальных клиентов. Стандарт OpenID Connect (OIDC), построенный поверх OAuth 2.0, решает проблему аутентификации, добавляя обязательный формат токена (JWT) и стандартизированные запросы для получения информации о пользователе.
Интересные факты
- Название OAuth происходит от слов «Open Authorization» (открытая авторизация).
- Первая версия OAuth (1.0) требовала подписи каждого запроса с использованием HMAC-SHA1 или RSA-SHA1, что делало её более безопасной с точки зрения криптографии, но значительно сложнее в реализации.
- OAuth 2.0 не обратно совместим с OAuth 1.0, и оба протокола могут сосуществовать в одной системе.
- Многие крупные интернет-компании (Google, Facebook (организация признана экстремистской и запрещена в РФ), Microsoft, Apple, VK, Яндекс) являются членами рабочей группы IETF по стандартизации OAuth.
Источники
- RFC 6749 — The OAuth 2.0 Authorization Framework
- RFC 6750 — The OAuth 2.0 Authorization Framework: Bearer Token Usage
- RFC 7636 — Proof Key for Code Exchange by OAuth Public Clients
- RFC 8252 — OAuth 2.0 for Native Apps
- OpenID Foundation — OpenID Connect Core 1.0 Specification
- Документация по OAuth 2.0 от Google, Microsoft, VK, Яндекс
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →