Документация

Лисайбер

Мини-приложения

Лисайбер.Панель поддерживает встраивание собственных решений в виде полноценного сервиса. Для этого используйте функционал мини-приложений. Для начала зарегистрируйте приложение в Лисайбер.Панели, заполните необходимые поля. После регистрации приложение появится в вашем личном кабинете. Вы можете отредактировать или удалить выбранное приложение, а также создать новое.

Подключение SDK

Добавьте скрипт SDK на страницу мини-приложения:
HTML
<script src="https://dash.leecyber.com/assets/scripts/mapp_sdk.js"></script>
После подключения скрипта доступен глобальный объект: window.LcPanel.
Параметры URL при загрузке
Панель добавляет query-параметры к URL вашего приложения: https://my-app.example.com/?client_id=abc123&parent_origin=https%3A%2F%2Fpanel.leecyber.com

Параметр

Описание

client_id

Client ID мини-приложения

parent_origin

Origin панели для безопасного postMessage

Инициализация

JAVASCRIPT
// Получаем параметры из URL const params = new URLSearchParams(window.location.search); const clientId = params.get('client_id'); const parentOrigin = params.get('parent_origin'); // Инициализация SDK LcPanel.init({ clientId: clientId, parentOrigin: parentOrigin, // рекомендуется явно передавать }); // Сообщаем панели, что приложение готово LcPanel.ready();

API

LcPanel.ready()
Сообщает панели, что приложение загружено. После этого панель скроет индикатор загрузки.
LcPanel.getContext()
Возвращает контекст текущего пользователя и права мини-приложения.

Поле

Тип

Описание

userId

string

ID пользователя

orgId

string

ID организации

locale

string

Язык интерфейса в формате: ru, en, kz...

theme

enum: white | dark

Тема панели: светлая, темная

appScopes

string[]

Scopes внутри мини-приложения

availableScopes

string[]

Доступные scopes

iamScopes

string[]

IAM Scopes, выданные пользователем

LcPanel.notify(payload)
Показывает уведомление в панели.

Параметр

Тип

Значения

message

string

-

level

string

success, error, warning, info

LcPanel.requestOAuth(params)
Запускает авторизацию пользователя в мини-приложении. Потребуется при изменении scopes. После успешной авторизации снова показывает мини-приложение.

Параметр

Тип

Описание

redirectUri

string

URL перенаправления после авторизации

redirect_uri

string

Альтернативное имя для redirectUri

scopes

string[]

Запрашиваемые scopes

scope

string

Scopes через пробел или запятую

LcPanel.close()
Закрывает мини-приложение (возврат на главную страницу панели).
LcPanel.on(type, handler)
Подписка на события от панели. Возвращает функцию отписки. Доступно событие THEME_CHANGED - пользователь сменил тему.

Протокол сообщений

SDK использует window.postMessage. Формат сообщения:
interface MiniappMessage {
  source: 'leecyberApp' | 'leecyberDashboard';
  type: string;
  payload?: Record<string, unknown>;
  requestId?: string; // для запросов с ответом
}
App → Panel: leecyberApp
Panel → App: leecyberDashboard

Тип

Ответ

Описание

APP_READY

Нет

Приложение готово

GET_CONTEXT

Да

Запрос контекста

SHOW_NOTIFICATION

Нет

Уведомление

REQUEST_OAUTH

Нет

Запуск авторизации

CLOSE

Нет

Закрыть приложение

STORAGE_GET

Да

Чтение хранилища

STORAGE_PUT

Да

Запись в хранилище

STORAGE_DELETE

Да

Удаление из хранилища

Хранилище (storage)

Мы предоставляем серверное key-value хранилище для мини-приложения. Данные привязываются к приложению и пользователю на стороне панели.
LcPanel.storage.get(key)
Возвращает { value: ... }
LcPanel.storage.put(key, value)
Создает или обновляет ключ. value - любой JSON-совместимый тип (string, number, boolean, object, array, null).
LcPanel.storage.remove(key)
Удаляет значение по ключу.
Пример работы с настройками
JAVASCRIPT
const SETTINGS_KEY = 'app-settings'; async function loadSettings() { try { const { value } = await LcPanel.storage.get(SETTINGS_KEY); return value || getDefaultSettings(); } catch { return getDefaultSettings(); } } async function saveSettings(settings) { await LcPanel.storage.put(SETTINGS_KEY, settings); LcPanel.notify({ level: 'success', message: 'Настройки сохранены' }); }

Ограничения хранилища

  • Ключ - непустая строка;
  • Значение сериализуется на сервере (JSON);
  • Данные доступны только внутри панели;
  • При ошибке API Promise отклоняется с текстом ошибки.

Авторизация

1. LcPanel.requestOAuth({ scopes: [...] })
        ↓
2. Панель открывает /authorize/{client_id} в iframe
        ↓
3. Пользователь подтверждает scopes
        ↓
4. Редирект на redirectUri с ?code=...
        ↓
5. Ваше приложение обменивает code на токен (на бэкенде)
        ↓
6. Панель возвращает iframe на URL приложения

Типичные проблемы

Проблема

Причина

Решение

SDK не отвечает

Приложение открыть не в панели

Откройте через панель

timeout

Панель не получила сообщение

Проверьте parentOrigin

Пустой контекст

Пользователь не авторизован или не выдан доступ

Проверьте доступ к мини-приложению

Storage error

Невалидный ключ или ошибка API

Проверьте ключ и сеть

Рекомендации

1. Всегда проверяйте parentOrigin
JAVASCRIPT
const parentOrigin = new URLSearchParams(location.search).get('parent_origin'); LcPanel.init({ clientId, parentOrigin });

2. Вызывайте ready() после загрузки UI

JAVASCRIPT
async function bootstrap() { LcPanel.init({ clientId, parentOrigin }); const context = await LcPanel.getContext(); renderApp(context); LcPanel.ready(); }

3. Реагируйте на смену темы

JAVASCRIPT
LcPanel.on('THEME_CHANGED', ({ theme }) => { document.documentElement.dataset.theme = theme; });

4. Не храните секреты в хранилище. Оно предназначено для пользовательских настроек и состояния UI, не для секретов и токенов.

5. Обрабатывайте ошибки

JAVASCRIPT
async function safeGet(key, fallback = null) { try { const { value } = await LcPanel.storage.get(key); return value ?? fallback; } catch { return fallback; } }

Краткая шпаргалка

JAVASCRIPT
// Инициализация LcPanel.init({ clientId, parentOrigin }); LcPanel.ready(); // Контекст const ctx = await LcPanel.getContext(); // Уведомления LcPanel.notify({ level: 'success', message: 'Готово' }); // OAuth LcPanel.requestOAuth({ scopes: ['id.read'] }); // Storage await LcPanel.storage.put('key', { foo: 'bar' }); const { value } = await LcPanel.storage.get('key'); await LcPanel.storage.remove('key'); // События LcPanel.on('THEME_CHANGED', (p) => console.log(p.theme)); // Закрытие LcPanel.close(); // Очистка LcPanel.destroy();