Обзор
Cabinet поддерживает вход через 4 OAuth-провайдера. Пользователи могут входить через социальные аккаунты вместо email+пароль.| Провайдер | Scope | Что получаем |
|---|---|---|
openid email profile | Email (верифицированный), имя, аватар | |
| Яндекс | login:info login:email | Email, логин, имя, аватар |
| Discord | identify email | Email, username, аватар |
| VK | email | Email (из токена), имя, аватар |
Как работает
- Пользователь нажимает кнопку провайдера в Cabinet
- Cabinet запрашивает URL авторизации у API бота (
GET /cabinet/auth/oauth/{provider}/authorize) - Бот генерирует CSRF-токен (state), сохраняет в Redis (TTL 10 минут) и возвращает URL
- Пользователь перенаправляется на страницу провайдера, подтверждает доступ
- Провайдер перенаправляет обратно на
{CABINET_URL}/auth/oauth/callbackс кодом - Cabinet отправляет код в API бота (
POST /cabinet/auth/oauth/{provider}/callback) - Бот обменивает код на токен, получает профиль пользователя, создаёт или находит аккаунт
- Возвращает 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
Шаг 1: Создание приложения
- Откройте VK для разработчиков
- Тип: Веб-сайт
- Заполните:
- Название: название вашего сервиса
- Адрес сайта:
https://cabinet.example.com - Базовый домен:
cabinet.example.com
- Нажмите “Подключить сайт”
Шаг 2: Настройка redirect URI
- Перейдите в настройки приложения
- Найдите раздел Платформы → Веб-сайт
- Доверенный redirect URI: добавьте
https://cabinet.example.com/auth/oauth/callback
Шаг 3: Получение ключей
- В настройках приложения найдите:
- ID приложения — это Client ID
- Защищённый ключ — это Client Secret
Шаг 4: .env бота
VK возвращает email в ответе на обмен кода (token response), а не через отдельный API. Email доступен только если пользователь дал согласие на передачу.
Итоговая настройка .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 корректен
