Настройка JWT-токенов для API 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка JWT-токенов для API 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка JWT-токенов для API 1С-Битрикс

JWT (JSON Web Token) — стандарт для передачи утверждений между системами в виде подписанного JSON-объекта. В контексте API 1С-Битрикс 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-авторизации в Битрикс

В 1С-Битрикс нет встроенного 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:

// Проверяем логин/пароль пользователя Битрикс
$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 дня в зависимости от сложности ролевой модели.