Налаштування JWT-токенів для API 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування JWT-токенів для API 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування JWT-токенів для API 1С-Bitrix

JWT (JSON Web Token) — стандарт для передачі твердження між системами у вигляді підписаного JSON-об'єкту. У контексті API 1С-Bitrix JWT використовується для авторизації запитів: клієнт пред'являє токен, сервер перевіряє підпис та дозволяє або відхиляє запит.

Що таке JWT: структура

Токен складається з трьох частин, розділених крапкою: header.payload.signature.

  • Header — алгоритм підпису: {"alg": "HS256", "typ": "JWT"}.
  • Payload — дані: {"sub": "user_id", "iat": 1700000000, "exp": 1700003600, "role": "api_client"}.
  • Signature — HMAC-SHA256 від header+payload з секретним ключем.

Токен не шифрується — payload читаємий. Але підробити підпис без секретного ключа неможливо.

Реалізація JWT-авторизації в Bitrix

В 1С-Bitrix немає вбудованого JWT-провайдера для REST API. JWT-аутентифікація реалізується через кастомний обробник у складі власного API-модуля або через хук в /local/php_interface/init.php.

Структура обробника:

use \Firebase\JWT\JWT;
use \Firebase\JWT\Key;

class JwtAuthMiddleware
{
    public static function authenticate(): ?int
    {
        $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
        if (!str_starts_with($authHeader, 'Bearer ')) {
            return null;
        }

        $token = substr($authHeader, 7);
        $secret = \Bitrix\Main\Config\Option::get('my_api', 'jwt_secret');

        try {
            $decoded = JWT::decode($token, new Key($secret, 'HS256'));
            return (int)$decoded->sub; // userId
        } catch (\Exception $e) {
            return null;
        }
    }
}

Бібліотека firebase/php-jwt встановлюється через Composer в /local/:

composer require firebase/php-jwt

Видача токенів: ендпоінт аутентифікації

Клієнт отримує JWT через /api/v1/auth/login:

// Перевіряємо логін/пароль користувача Bitrix
$user = new CUser();
if ($user->Login($login, $password) === true) {
    $userId = $USER->GetID();
    $payload = [
        'sub' => $userId,
        'iat' => time(),
        'exp' => time() + 3600, // 1 година
        'role' => getUserRole($userId),
    ];
    $token = JWT::encode($payload, $secret, 'HS256');
    echo json_encode(['token' => $token, 'expires_in' => 3600]);
}

Refresh-токени. Короткотривалий access-токен (1 година) + довготривалий refresh-токен (30 днів). При закінченні access-токена клієнт використовує refresh для отримання нового. Refresh-токени зберігаються в таблиці b_local_api_refresh_tokens з прив'язкою до користувача та можливістю відпалу.

Секретний ключ

Секрет для підпису зберігається в b_option:

// Генерація при встановленні модуля
$secret = bin2hex(random_bytes(32)); // 64 символи
\Bitrix\Main\Config\Option::set('my_api', 'jwt_secret', $secret);

Ротація ключа: при зміні секрету всі видані токени стають невалідними. Потрібен механізм «м'якої» ротації — зберігати два ключи (старий та новий) під час перехідного періоду.

Перевірка токена в захищених ендпоінтах

// На початку кожного API-контролера
$userId = JwtAuthMiddleware::authenticate();
if (!$userId) {
    http_response_code(401);
    echo json_encode(['error' => 'Unauthorized']);
    exit;
}

Зберігання claims

У payload можна включати додаткові дані, щоб не робити зайві запити до БД:

{
  "sub": 42,
  "iat": 1700000000,
  "exp": 1700003600,
  "role": "manager",
  "groups": [1, 5, 12],
  "permissions": ["crm.read", "catalog.write"]
}

Але обережно: payload збільшує розмір токена. Права, які часто змінюються, краще перевіряти в БД при кожному запиті.

Налаштування JWT-авторизації для нового API — 1-2 дні залежно від складності ролевої моделі.