Что такое Oauth 20?
OAuth 2.0 — открытый протокол авторизации, позволяющий приложениям получать ограниченный доступ к ресурсам пользователя в сторонних сервисах без передачи логина и пароля. Стандарт описан в RFC 6749 и является основой для кнопок «Войти через Google / GitHub / Яндекс» и для делегированного доступа между API. OAuth 2.0 решает задачу авторизации (что можно делать), тогда как OpenID Connect, построенный поверх него, решает задачу аутентификации (кто пользователь).
Роли в OAuth 2.0
Протокол определяет четыре участника:
- Resource Owner (владелец ресурса) — пользователь, которому принадлежат данные (например, его Google-контакты).
- Resource Server (сервер ресурсов) — API, хранящее данные пользователя (Google Contacts API).
- Client (клиент) — приложение, запрашивающее доступ к данным от имени пользователя (ваш сайт или мобильное приложение).
- Authorization Server (сервер авторизации) — выдаёт токены доступа после подтверждения пользователем. Часто совмещён с сервером ресурсов (Google OAuth Server).
Ключевые типы потоков (Grant Types)
OAuth 2.0 определяет несколько потоков для разных сценариев:
- Authorization Code — основной и наиболее безопасный поток для веб-приложений. Клиент получает authorization code (через браузер пользователя), затем обменивает его на access token через прямой server-to-server запрос. Для публичных клиентов (SPA, мобильные приложения) дополняется PKCE.
- Authorization Code + PKCE (Proof Key for Code Exchange) — расширение для публичных клиентов, где нельзя хранить секрет. Клиент генерирует случайный code_verifier, хэширует его в code_challenge и отправляет при запросе кода. При обмене кода на токен передаёт code_verifier — сервер проверяет соответствие.
- Client Credentials — для machine-to-machine взаимодействия без участия пользователя. Клиент аутентифицируется своим ID и секретом и получает токен. Используется в микросервисах.
- Refresh Token — не самостоятельный поток, а механизм обновления истёкшего access token без повторной авторизации пользователя.
Устаревшие потоки (Implicit, Resource Owner Password Credentials) не рекомендуются к использованию в новых проектах.
Authorization Code Flow: пошаговый разбор
- Пользователь нажимает «Войти через Google» на вашем сайте.
- Сайт перенаправляет браузер на Google Authorization Server с параметрами:
client_id,redirect_uri,scope,response_type=code,state(CSRF-защита). - Google показывает страницу согласия (consent screen) с перечнем запрашиваемых разрешений.
- Пользователь соглашается. Google перенаправляет обратно на
redirect_uriс параметромcode. - Сервер вашего сайта отправляет POST-запрос к Google Token Endpoint с
code,client_idиclient_secret. - Google возвращает
access_token,refresh_tokenи (если запрошен OpenID Connect)id_token. - Сервер использует access_token для обращения к Google API от имени пользователя.
Scopes: ограничение доступа
Scopes определяют, к каким ресурсам и действиям клиент запрашивает доступ. Пользователь видит запрашиваемые разрешения на странице согласия и может отозвать их позже. Примеры scopes Google: profile, email, https://www.googleapis.com/auth/calendar.readonly. Принцип минимальных привилегий: запрашивать только те scopes, которые действительно нужны приложению.
Access Token и его хранение
Access token — краткоживущий токен (минуты/часы) для доступа к API. Обычно это JWT (в OpenID Connect) или непрозрачная строка (opaque token). В браузерных приложениях хранится в памяти или httpOnly cookie. В мобильных приложениях — в защищённом хранилище (Keychain на iOS, Keystore на Android). Никогда не следует хранить access token в незащищённом хранилище.
OpenID Connect поверх OAuth 2.0
OAuth 2.0 решает авторизацию: «дать приложению доступ к ресурсу». OpenID Connect (OIDC) добавляет аутентификацию: «подтвердить личность пользователя». OIDC вводит ID Token (JWT с данными о пользователе), UserInfo Endpoint и стандартный набор scopes (openid, profile, email). Практически все системы «Войти через...» используют OIDC, а не чистый OAuth 2.0.
Практика: реализация OAuth в приложении
Использование готовых библиотек вместо реализации вручную — правило безопасности. Для Next.js: NextAuth.js (Auth.js), Lucia. Для Node.js: Passport.js, openid-client. Для Python: Authlib, python-jose. Сервисы авторизации (Auth0, Clerk, Okta, Supabase Auth, Keycloak) предоставляют полное решение, избавляя от необходимости управлять ключами, refresh token-ами и безопасностью самостоятельно.
Частые вопросы
В чём разница между OAuth 2.0 и OpenID Connect?
OAuth 2.0 — протокол авторизации: он позволяет приложению получить доступ к ресурсам от имени пользователя. OpenID Connect (OIDC) — протокол аутентификации, построенный поверх OAuth 2.0: он добавляет стандартный способ узнать, кто пользователь (ID Token с email, именем и другими данными профиля). Кнопки 'Войти через Google' используют именно OIDC.
Что такое PKCE и зачем он нужен?
PKCE (Proof Key for Code Exchange) — расширение Authorization Code Flow для публичных клиентов (SPA, мобильные приложения), которые не могут безопасно хранить client_secret. PKCE защищает от перехвата authorization code: клиент генерирует случайный verifier, передаёт его хэш при запросе кода и оригинал при обмене — сервер проверяет соответствие.
Как OAuth 2.0 защищает от CSRF-атак?
Параметр state — случайная строка, которую клиент генерирует перед перенаправлением на сервер авторизации и проверяет в callback. Если state в ответе не совпадает с сохранённым, запрос отклоняется. Это защищает от атак, когда злоумышленник обманом заставляет пользователя завершить чужой OAuth-поток.
Другие термины в теме «Веб-разработка»
Не хватает деталей?
Напишите, что уточнить по теме «Oauth 20» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).