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

Лисайбер

Регистрация и интеграция

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

Параметры приложения

На странице приложения отображаются его основные параметры: 

Client ID — уникальный идентификатор приложения. Идентификатор нельзя изменить. 

Client secret — секретный ключ приложения, которым будет подписан jwt-токен с информацией о пользователе. 

Redirect URI — адрес страницы, на который пользователь будет перенаправлен после авторизации. Страница по указанному адресу также будет принимать OAuth-токен. 

Параметры понадобятся для авторизации приложения на этапах получения oAuth-токена и при выполнении запроса данных о пользователе.

Поток авторизации

1. Ваше приложение перенаправляет пользователя на страницу авторизации;

2. Пользователь входит в панель (если не авторизован);

3. Пользователь видит экран согласия с запрашиваемыми правами;

4. После подтверждения — перенаправление на redirect_uri с code;

5. Ваш бэкенд обменивает code на access_token (с client_secret);

6. API-запросы выполняются с заголовком Authorization: Bearer {access_token}.

Шаг 1. Перенаправление на страницу авторизации

Перенаправьте пользователя на страницу: https://dash.leecyber.com/authorize/{client_id}.

Query-параметры

Параметр

Обязательный

Описание

redirect_uri

Да

URI callback. Должен точно совпадать с Redirect URL в настройках приложения

response_type

Да

Укажите code

scope[]

Нет

Запрашиваемый доступ. Можно передать несколько: scope[]=id.read&scope[]=org.billing. Если не указаны — используются scopes из настроек приложения

state

Рекомендуется

Случайная строка для защиты от CSRF. Вернётся в callback

code_challenge

Нет

PKCE challenge (см. PKCE)

code_challenge_method

Нет

Метод PKCE: S256 (по умолчанию) или plain

Пример: https://dash.leecyber.com/authorize/client_id_abc123?redirect_uri=https%3A%2F%2Fmy-app.example.com%2Foauth%2Fcallback&response_type=code&scope\[\]=id.read&scope\[\]=org.billing&state=k7x9m2p4q1

Шаг 2. Согласие пользователя

На странице /authorize/{client_id} панель: 

1. Проверяет `client_id` и `redirect_uri`;

2. Если пользователь не авторизован — показывает форму входа;

3. Показывает экран согласия: название приложения, иконка, список запрашиваемых прав ;

4. После нажатия «Продолжить» — выполняет авторизацию.

Если пользователь уже выдавал доступ этому приложению, панель может автоматически перенаправить на `redirect_uri` с `code` без повторного экрана согласия.

Шаг 3. Обмен кода на токен авторизации

После успешной авторизации браузер перенаправляется на ваш redirect_uri: https://my-app.example.com/oauth/callback?code=AUTH_CODE_HERE&state=k7x9m2p4q1

Важно: обмен `code` на токен выполняется только на сервере. Никогда не передавайте и не публикуйте `client_secret`.

POST https://api.leecyber.com/v3/oauth/token
Content-Type: application/json

Тело запроса

JSON{
  "grant_type": "authorization_code",
  "code": "AUTH_CODE_HERE",
  "redirect_uri": "https://my-app.example.com/oauth/callback",
  "client_id": "client_id_abc123",
  "client_secret": "client_secret_xyz789"
}

Ответ

JSON{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "refresh_token": "dGhpcyBpcyBhIHJlZnJlc2g...",
  "expires_in": 86400,
  "token_type": "Bearer"
}

Пример кода

async function exchangeCode(code) {
  const response = await fetch('https://api.leecyber.com/v3/oauth/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      grant_type: 'authorization_code',
      code,
      redirect_uri: process.env.LC_REDIRECT_URI,
      client_id: process.env.LC_CLIENT_ID,
      client_secret: process.env.LC_CLIENT_SECRET,
    }),
  });
if (!response.ok) {
    const err = await response.json().catch(() => ({}));
    throw new Error(err.message || 'Token exchange failed');
  }
return response.json();
}

Шаг 4. Использование токена авторизации

Передайте токен в заголовке Authorization. В формате: Bearer {access_token}.

Пример кода

const response = await fetch('https://api.leecyber.com/v3/org/billing', { headers: { Authorization: `Bearer ${accessToken}`, }, });

Шаг 5. Обновление токена

Когда access_token истекает, обновите его через refresh_token:

POST https://api.leecyber.com/v3/oauth/token
Content-Type: application/json

{ "grant_type": "refresh_token", "refresh_token": "dGhpcyBpcyBhIHJlZnJlc2g...", "client_id": "client_id_abc123", "client_secret": "client_secret_xyz789" }

Ответ — новая пара access_token + refresh_token (аналогично обмену code).

PKCE

Для публичных клиентов (SPA, мобильные приложения) поддерживается PKCE.

Шаг 1. Генерация challenge

function generatePkce() {
  const verifier = crypto.randomBytes(32).toString('base64url');
  const challenge = crypto
    .createHash('sha256')
    .update(verifier)
    .digest('base64url');
return { verifier, challenge };
}

Шаг 2. Авторизация с PKCE

https://dash.leecyber.com/authorize/%7Bclient_id%7D?redirect_uri=...&response_type=code&state=...&code_challenge={challenge}&code_challenge_method=S256

Шаг 3. Обмен code с verifier

{
  "grant_type": "authorization_code",
  "code": "...",
  "redirect_uri": "...",
  "client_id": "...",
  "code_verifier": "original_verifier_string"
}

Scopes

Scopes (доступы) задаются при регистрации приложения и могут быть уточнены в authorize URL. Запрашивать можно только scopes, разрешённые для oAuth-приложений организации. Список доступных scopes можно посмотреть при создании oAuth-приложения или его редактировании. Запрашивайте минимально необходимый набор scopes.

Безопасность

  • Храните client_secret только на сервере в .env файле;
  • Не встраивайте в фронтенд, мобильные приложения, публичные репозитории client_secret;
  • Для публичных клиентов используйте PKCE;
  • Всегда передавайте state и проверяйте его в callback;
  • Не используйте wildcard-домены;
  • В продакшене используйте только https:// для redirect_uri и callback;