Коды ошибок
У ошибок Fidmos три разные формы — они зависят от того, какой эндпоинт ответил. Эта страница показывает каждую форму и её коды.
Формы ответа
Заголовок раздела «Формы ответа»- Встройка (
/api/v1/embed/*) — конверт{ "error": "<код>" }, HTTP 422 (или 401 дляinvalid_client). - Токен (
POST /oauth/token) — стандарт OAuth 2.0 (RFC 6749):{ "error": "...", "error_description": "..." }. - UserInfo и Server-to-Server API — форма Laravel:
{ "message": "...", "errors": { … } }либо401/403для проблем с токеном.
Инициализация потока — POST /api/v1/embed/init
Заголовок раздела «Инициализация потока — POST /api/v1/embed/init»Это дёргает виджет входа (sdk.js), не вы — ошибки показывает окно. Конверт { "error": "<код>" }.
| Код | HTTP | Причина |
|---|---|---|
invalid_client |
401 | неизвестный или неактивный client_id |
invalid_redirect_uri |
422 | redirect_uri не в списке разрешённых |
invalid_origin |
422 | источник страницы не разрешён для клиента |
Шаги окна — /api/v1/embed/*
Заголовок раздела «Шаги окна — /api/v1/embed/*»Их вызывает виджет входа (шаги под /api/v1/embed/: login, login/send, telegram,
siwe/*, identity/create, complete) — вам, партнёру, дёргать их не нужно. Общие для
любого шага окна — ошибки проверки потока:
| Код | Причина |
|---|---|
flow_expired |
поток не найден или истёк |
parent_origin_mismatch |
запрос пришёл с чужого источника |
Отправка кода (/login/send):
| Код | Причина |
|---|---|
code_send_limit |
исчерпан лимит отправок кода |
flow_too_short |
у потока мало времени жизни — новый код не выдаётся |
invalid_flow_state |
поток не на том шаге |
Проверка кода (/login):
| Код | Причина |
|---|---|
invalid_code |
код неверен |
code_expired |
срок кода истёк |
code_attempts_exhausted |
исчерпаны попытки |
identity_taken |
привязка занята другим пользователем |
Telegram (/telegram) — поток входа через Telegram:
| Код | Причина |
|---|---|
telegram_invalid |
данные Telegram не прошли проверку подписи |
Кошелёк — SIWE (/siwe/verify) — поток входа кошельком:
| Код | Причина |
|---|---|
nonce_mismatch |
nonce в сообщении не совпал с выданным |
Плюс коды проверки самого SIWE-сообщения и подписи — их полный список на странице входа кошельком.
Создание пользователя (/identity/create) — для входа через Telegram и кошелёк:
| Код | Причина |
|---|---|
no_pending_identity |
нет отложенного способа входа для создания пользователя |
identity_taken |
привязываемый способ занят другим пользователем |
Завершение (/complete):
| Код | HTTP | Причина |
|---|---|---|
invalid_completion |
409 | завершение потока не удалось |
authorization_failed |
422 | окно не смогло выпустить код авторизации |
Обмен на токен — POST /oauth/token
Заголовок раздела «Обмен на токен — POST /oauth/token»Стандартные ошибки OAuth 2.0 в форме { "error": "...", "error_description": "..." }:
error |
Причина |
|---|---|
invalid_grant |
код неверен, истёк, уже использован, либо не совпал code_verifier |
invalid_client |
неверные учётные данные клиента |
invalid_request |
не хватает обязательного параметра |
unsupported_grant_type |
неподдерживаемый grant_type |
UserInfo и Server-to-Server API
Заголовок раздела «UserInfo и Server-to-Server API»GET /oauth/userinfo и /api/v1/* отвечают в форме Laravel:
401— токен отсутствует, истёк или отозван.403— только Server-to-Server/api/v1/*: токену клиента не хватает скоупаusers.read./oauth/userinfoпо скоупу не отказывает — он вернётsubи те claims, что разрешает скоуп токена.422с{ "message": "...", "errors": { "поле": ["…"] } }— не прошла валидация.
Как читать ошибку
Заголовок раздела «Как читать ошибку»- Посмотрите на форму ответа — по ней понятно, какой эндпоинт ответил.
- Возьмите машиночитаемый код (
error) — по нему ветвите логику, а не по тексту. - Текст (
error_description/message) — для логов и людей, не для условий в коде.
Диагностика частых провалов
Заголовок раздела «Диагностика частых провалов»| Симптом | Причина | Что делать |
|---|---|---|
invalid_redirect_uri, либо ошибка redirect_uri при /oauth/authorize//oauth/token |
redirect_uri не совпал с зарегистрированным — сверка точная |
Зарегистрируйте точный URL в приложении (кабинет → Приложения): схема, хост, путь, завершающий слэш; в запросе шлите его без изменений |
invalid_origin или parent_origin_mismatch |
Страница с виджетом открыта не с разрешённого домена | Разрешённый origin выводится из redirect_uris приложения — добавьте нужный домен в redirect_uris (кабинет → Приложения) и открывайте окно с него |
Ошибка CORS на /api/v1/embed/* в браузере |
Запрос ушёл с домена, которого нет среди origin приложения | Добавьте домен окна в redirect_uris приложения (кабинет → Приложения) — origin берётся оттуда, и для него сервер вернёт нужные CORS-заголовки |
invalid_client |
Неверные client_id / client_secret |
Проверьте пару; client_secret — не публичный client_id, и живёт только на бэкенде |
invalid_grant при обмене кода |
Код истёк или уже использован, не тот redirect_uri, либо code_verifier не соответствует code_challenge (рассинхрон PKCE) |
Меняйте код тем же code_verifier, что пришёл в onSuccess; код одноразовый; redirect_uri — тот же, что был передан в login |
В профиле нет email или email_verified: false |
Пользователь без почты (вход кошельком/Telegram) или почта не подтверждена | Опознавайте по sub, не по почте; не требуйте её наличия и не доверяйте email_verified: false |