Обзор
Cabinet поддерживает вход через 4 OAuth-провайдера. Пользователи могут входить через социальные аккаунты вместо email+пароль.| Провайдер | Scope | Что получаем |
|---|---|---|
openid email profile | Email (верифицированный), имя, аватар | |
| Яндекс | login:info login:email | Email, логин, имя, аватар |
| Discord | identify email | Email, username, аватар |
| VK ID | vkid.personal_info email | Email, имя, фамилия, аватар (OAuth 2.1 + PKCE) |
Как работает
- Пользователь нажимает кнопку провайдера в Cabinet
- Cabinet запрашивает URL авторизации у API бота (
GET /cabinet/auth/oauth/{provider}/authorize) - Бот генерирует CSRF-токен (state), сохраняет в Redis (TTL 10 минут) и возвращает URL. Для VK ID дополнительно генерируется PKCE-пара (
code_verifier+code_challenge) - Пользователь перенаправляется на страницу провайдера, подтверждает доступ
- Провайдер перенаправляет обратно на
{CABINET_URL}/auth/oauth/callbackс кодом - Cabinet отправляет код в API бота (
POST /cabinet/auth/oauth/{provider}/callback) - Бот обменивает код на токен (для VK ID — с
code_verifierвместоclient_secret), получает профиль пользователя, создаёт или находит аккаунт - Возвращает JWT-токены для авторизации в Cabinet
Привязка аккаунтов
- Если пользователь с таким OAuth provider_id уже существует — вход
- Если email совпадает с существующим (и верифицирован у провайдера) — аккаунт автоматически привязывается
- Если аккаунт не найден — создаётся новый
Redirect URI
Для всех провайдеров redirect URI одинаковый:https://cabinet.example.com/auth/oauth/callback
Шаг 1: Создание проекта
- Откройте Google Cloud Console
- Создайте новый проект (или выберите существующий)
- Включите Google+ API или People API:
- Меню → APIs & Services → Library
- Найдите и включите “Google People API”
Шаг 2: Настройка OAuth Consent Screen
- Меню → APIs & Services → OAuth consent screen
- Выберите External (доступ для всех аккаунтов Google)
- Заполните:
- App name: название вашего сервиса
- User support email: ваш email
- Developer contact information: ваш email
- Scopes: добавьте
openid,email,profile - Test users: добавьте свой email для тестирования (пока приложение не верифицировано)
Шаг 3: Создание credentials
- Меню → APIs & Services → Credentials
- Create Credentials → OAuth client ID
- Application type: Web application
- Name: любое (например, “Cabinet OAuth”)
- Authorized redirect URIs: добавьте
https://cabinet.example.com/auth/oauth/callback - Нажмите Create
- Скопируйте Client ID и Client Secret
Шаг 4: .env бота
Публикация приложения
Пока приложение в статусе Testing, только добавленные тестовые пользователи могут входить. Для открытого доступа:- OAuth consent screen → Publish App
- Для приложений с sensitive scopes потребуется верификация Google (несколько дней)
Scopes
openid, email, profile не являются sensitive — верификация обычно проходит автоматически.Яндекс
Шаг 1: Создание приложения
- Откройте Яндекс OAuth
- Заполните:
- Название: название вашего сервиса
- Иконка: по желанию
- Платформа: Веб-сервисы
- Redirect URI:
https://cabinet.example.com/auth/oauth/callback
- Права:
- Яндекс.Паспорт → Доступ к логину, имени и фамилии, полу (
login:info) - Яндекс.Паспорт → Доступ к адресу электронной почты (
login:email)
- Яндекс.Паспорт → Доступ к логину, имени и фамилии, полу (
- Нажмите “Создать приложение”
- Скопируйте ID и Пароль (Client Secret)
Шаг 2: .env бота
Яндекс OAuth не требует верификации приложения — работает сразу после создания.
Discord
Шаг 1: Создание приложения
- Откройте Discord Developer Portal
- New Application → введите название → Create
- Перейдите в OAuth2 (левое меню)
Шаг 2: Настройка OAuth2
- Redirects: добавьте
https://cabinet.example.com/auth/oauth/callback - Скопируйте Client ID (на вкладке General Information или OAuth2)
- Client Secret: нажмите Reset Secret и скопируйте
Шаг 3: .env бота
VK ID
Бот использует VK ID OAuth 2.1 с обязательным PKCE (S256). Старый VK OAuth 2.0 (
oauth.vk.com) прекратил работу 30 сентября 2025 года.Шаг 1: Создание приложения в VK ID
- Откройте VK ID для бизнеса
- Нажмите Создать приложение
- Заполните:
- Название: название вашего сервиса
- Тип: Веб-сайт
- URL сайта:
https://cabinet.example.com
- Нажмите Создать
Шаг 2: Настройка OAuth
- Перейдите в настройки приложения → Авторизация
- Добавьте redirect URI:
https://cabinet.example.com/auth/oauth/callback - Убедитесь что включены scope:
vkid.personal_info,email
Шаг 3: Получение ключей
- В настройках приложения найдите:
- App ID — это Client ID
- Защищённый ключ (Service Key) — это Client Secret
Шаг 4: .env бота
Особенности VK ID OAuth 2.1
| Параметр | Значение |
|---|---|
| Авторизация | https://id.vk.com/authorize |
| Обмен кода | https://id.vk.com/oauth2/auth |
| Профиль | https://id.vk.com/oauth2/user_info |
| PKCE | Обязателен (S256) — генерируется автоматически |
device_id | Возвращается при авторизации, используется при обмене кода |
| Scope | vkid.personal_info email |
Email доступен только если пользователь дал согласие на передачу. Профиль запрашивается через отдельный эндпоинт
/oauth2/user_info (POST с access_token и client_id).Итоговая настройка .env
Пример со всеми четырьмя провайдерами:Проверка
API: список провайдеров
*_ENABLED=true, *_CLIENT_ID и *_CLIENT_SECRET заполнены.
Тестирование входа
- Откройте Cabinet в браузере
- На экране входа должны появиться кнопки включённых провайдеров
- Нажмите на провайдер — должно перенаправить на страницу авторизации
- После подтверждения — вернуть в Cabinet с авторизованной сессией
Устранение проблем
”redirect_uri_mismatch” (Google)
Redirect URI в Google Console не совпадает с{CABINET_URL}/auth/oauth/callback. Проверьте:
- Протокол (http vs https)
- Наличие/отсутствие
/в конце - Точный домен (www vs без www)
“Invalid or expired OAuth state”
CSRF-токен протух (TTL 10 минут) или Redis недоступен. Причины:- Пользователь слишком долго авторизовался у провайдера
- Redis не работает или перезапустился
- Бот перезапустился между генерацией state и callback
”Failed to exchange authorization code”
Код авторизации невалиден. Причины:- Код уже был использован (одноразовый)
- Неверный Client Secret
- Redirect URI в запросе на обмен не совпадает с redirect URI при авторизации
Провайдер не появляется в Cabinet
- Проверьте
OAUTH_*_ENABLED=trueв.env - Убедитесь что
OAUTH_*_CLIENT_IDиOAUTH_*_CLIENT_SECRETне пустые - Перезапустите бота после изменения
.env - Проверьте API:
GET /cabinet/auth/oauth/providers
Пользователь входит но email не привязан
- Discord: email верифицирован в аккаунте пользователя?
- VK: пользователь дал согласие на передачу email?
- Google/Яндекс: email возвращается всегда если scope корректен
