#Launch URL и SSO
SSO позволяет открыть Smartica из МИС без повторного ввода логина и пароля. Запрос выполняет только доверенный бэкенд МИС.
#Endpoint
Канонический шаблон:
POST https://app.smartica.ai/api/integrations/{platform}/sso/token
Используйте точный URL, выданный при онбординге. {platform} — placeholder зарегистрированного адаптера; произвольная подстановка нового slug вернёт 404.
#Запрос
POST /api/integrations/{platform}/sso/token
Authorization: Bearer <SSO_KEY>
Content-Type: application/json
Accept: application/json
{
"user_email": "doctor@clinic.ru",
"user_full_name": "Иванов Иван Иванович",
"encounter_id": "12345"
}
| Поле | Обязательно | Ограничения |
|---|---|---|
user_email |
да | Валидный email, до 255 символов; регистр не учитывается |
user_full_name |
условно | Непустая строка до 255 символов; обязательно для первого входа или восстановления врача |
encounter_id |
да | Строка: только цифры либо UUID в форме 8-4-4-4-12 |
Рекомендуется всегда отправлять user_full_name. Для существующего активного пользователя оно не требуется, но это избавляет МИС от отдельной проверки первого входа.
Не передавайте platform, email и ФИО напрямую из неподтверждённых полей браузера. Получайте их на бэкенде из текущего пользователя и карточки приёма.
#Автоматическое создание врача
При SSO-запросе Smartica:
- ищет пользователя по нормализованному email;
- использует существующий аккаунт, если он доступен этой организации;
- создаёт нового врача по
user_emailиuser_full_name, если аккаунта нет; - восстанавливает ранее удалённый аккаунт по тем же данным;
- проверяет, что интеграция включена для организации.
Новый врач сразу входит через доверенный SSO без отдельной регистрации и подтверждения email.
Если существующий email уже относится к другой организации Smartica, автоматический перенос запрещён: API вернёт 403 email_in_other_organization.
#Ответ 200
{
"launch_url": "https://app.smartica.ai/launch?platform=your-mis&encounter_id=12345&t=<one_time_token>",
"expires_in": 60
}
expires_in — фактическое время жизни ссылки в секундах. Не зашивайте значение 60 в логику: используйте значение ответа.
После ответа:
- сразу перенаправьте браузер на
launch_urlчерез HTTP302или откройте его в новой вкладке; - передайте URL без изменений;
- не извлекайте и не сохраняйте параметр
t; - при открытии Smartica удалит токен из адресной строки редиректом на чистый URL.
#Свойства launch_url
- токен одноразовый;
- токен ограничен временем из
expires_in; - токен привязан к пользователю,
platformиencounter_id; - изменение
encounter_idв URL делает вход недействительным; - повторное открытие использованной или просроченной ссылки приводит к обычному экрану входа.
Если ссылка истекла до открытия, запросите новую. Не пытайтесь повторно использовать старую.
#Ошибки SSO
Все ошибки возвращаются в JSON. Для 422 дополнительно приходит объект errors.
| Код | error |
Причина | Действие МИС |
|---|---|---|---|
401 |
— | Нет или неверен SSO_KEY |
Проверить секрет; не повторять запрос автоматически |
403 |
email_in_other_organization |
Email относится к другой организации | Показать message, обратиться в Smartica |
403 |
integration_not_enabled |
Интеграция не включена для организации | Обратиться в Smartica |
404 |
— | Аккаунт недоступен для внешнего SSO либо endpoint не зарегистрирован | Проверить URL; затем обратиться в Smartica |
422 |
— | Ошибка email, ФИО или формата encounter_id |
Исправить поля из errors |
429 |
— | Превышено 30 запросов в минуту | Учитывать Retry-After, не запускать цикл повторов |
503 |
— | Интеграция или SSO не настроены | Показать временную ошибку, обратиться в Smartica |
Пример 422 для нового врача без ФИО:
{
"message": "Неверные данные.",
"errors": {
"user_full_name": [
"Для создания врача нужно ФИО (user_full_name)."
]
}
}
Пример конфликта организации:
{
"error": "email_in_other_organization",
"message": "Этот email уже привязан к другой организации в Smartica. Обратитесь в поддержку Smartica для переноса аккаунта."
}
Не заменяйте конкретный message общим «не авторизован». Для 401, 403 и 422 покажите понятную ошибку и не повторяйте тот же запрос без изменения причины. Для сетевого сбоя или 5xx можно предложить врачу повторить запуск.
#Безопасность
- вызывайте endpoint только по HTTPS и только с бэкенда;
- храните
SSO_KEYв менеджере секретов или переменных окружения сервера; - используйте разные ключи для разных окружений;
- не помещайте
SSO_KEY, токен илиlaunch_urlв frontend, аналитику, exception tracker и access-логи; - не отправляйте
launch_urlвRefererна сторонние домены; - ротируйте ключ через согласованный с Smartica процесс.
#Пример curl
Подставьте точный endpoint, полученный при онбординге:
SSO_ENDPOINT='https://app.smartica.ai/api/integrations/your-mis/sso/token'
SSO_KEY='replace-with-secret'
curl --fail-with-body --silent --show-error \
--request POST "${SSO_ENDPOINT}" \
--header "Authorization: Bearer ${SSO_KEY}" \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data '{
"user_email": "doctor@clinic.ru",
"user_full_name": "Иванов Иван Иванович",
"encounter_id": "12345"
}'
#Отладка без SSO
Только для локальной проверки, если врач уже авторизован в Smartica:
const url = `https://app.smartica.ai/launch?platform=${platform}&encounter_id=${encounterId}`;
window.open(url, '_blank', 'noopener,noreferrer');
Не используйте этот вариант на общем тестовом или рабочем окружении.