Как реализовать Hawk-авторизацию в 1С: пошаговое руководство

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Авторизация по протоколу Hawk является современным и безопасным способом взаимодействия между клиентом и сервером. В отличие от базовой авторизации, здесь не передаются пароли в открытом виде. Вместо этого используется механизм создания симметричной подписи сообщения. Рассмотрим подробнее, как реализовать этот алгоритм в среде 1С:Предприятие, используя встроенные средства криптографии и работы с HTTP-запросами.

Что такое Hawk-авторизация и из чего она состоит

Проанализируем основные компоненты, которые нам потребуются для успешного прохождения проверки на сервере. Согласно документации протокола, заголовок Authorization должен содержать следующие поля:

  1. id — идентификатор ключа доступа (Hawk Auth ID).
  2. ts (timestamp) — текущее время в формате UNIX (количество секунд, прошедших с 1 января 1970 года).
  3. nonce — случайная уникальная строка, которая предотвращает атаки повторного воспроизведения запроса.
  4. mac (Message Authentication Code) — результат хеширования нормализованной строки запроса с использованием секретного ключа (Hawk Auth Key).

Выясним причину, по которой обычное копирование заголовка из Postman не работает: параметры ts, nonce и mac должны генерироваться заново для каждого нового запроса. Если сервер получит запрос с устаревшим ts или уже использованным ранее nonce, он вернет ошибку 401.

Шаг 1. Получение UNIX-времени в 1С

Разберем, как получить значение ts. В 1С нет встроенной функции для получения времени в формате UNIX, но мы можем легко вычислить его самостоятельно. Разберем пример кода:


Функция ПолучитьUnixВремя()
    НачалоЭпохи = Дата(1970, 1, 1, 0, 0, 0);
    ТекущееВремяУниверсальное = ТекущаяУниверсальнаяДата();
    Возврат Формат(ТекущееВремяУниверсальное - НачалоЭпохи, "ЧГ=0");
КонецФункции

Важно использовать именно ТекущаяУниверсальнаяДата(), так как время в Hawk всегда должно быть по Гринвичу (UTC). Разница во времени между сервером 1С и целевым сервером более чем на несколько минут приведет к отказу в авторизации.

Шаг 2. Генерация Nonce

Для создания nonce нам подойдет любая случайная строка. Проще всего использовать часть уникального идентификатора. Посмотрим на пример реализации:


Функция СгенерироватьNonce()
    УИД = Строка(Новый УникальныйИдентификатор);
    // Возьмем первые 6 символов GUID для краткости
    Возврат Сред(СтрЗаменить(УИД, "-", ""), 1, 6);
КонецФункции

Шаг 3. Формирование нормализованной строки

Это самый ответственный этап. Чтобы сервер смог проверить вашу подпись, вы должны собрать строку данных в строго определенном порядке. Проанализируем структуру нормализованной строки для заголовка:

  1. Префикс протокола: hawk.1.header
  2. Временная метка (ts)
  3. Уникальная строка (nonce)
  4. HTTP-метод (GET, POST и т.д. в верхнем регистре)
  5. Путь запроса (URI, например /api/v1/data)
  6. Имя хоста (например example.com)
  7. Порт (например 443 для HTTPS или 80 для HTTP)
  8. Хеш тела запроса (если используется, иначе пусто)
  9. Дополнительные данные (ext) — обычно пустая строка

Каждый элемент должен отделяться символом переноса строки \n. Рассмотрим подробнее код сборки этой строки в 1С:


// Предположим, у нас есть переменные:
// Метод = "POST", URI = "/api/resource", Хост = "api.mysite.com", Порт = "443"

НормализованнаяСтрока = "hawk.1.header" + Символы.ПС
    + ТекущийTS + Символы.ПС
    + ТекущийNonce + Символы.ПС
    + ВРег(Метод) + Символы.ПС
    + URI + Символы.ПС
    + НРег(Хост) + Символы.ПС
    + Порт + Символы.ПС
    + "" + Символы.ПС // Здесь мог быть хеш тела запроса
    + "" + Символы.ПС; // Дополнительные данные

Важный момент: в конце нормализованной строки обязательно должен присутствовать завершающий символ переноса строки.

Шаг 4. Вычисление MAC (подписи)

Теперь нам необходимо подписать полученную строку с помощью Hawk Auth Key, используя алгоритм HMAC-SHA256. В современных версиях платформы 1С (8.3.10 и выше) мы можем использовать объект ХешированиеДанных.

Рассмотрим, как это реализовать. Обратите внимание, что результат хеширования должен быть представлен в виде строки Base64.


Функция ВычислитьHMAC_SHA256(СтрокаДанных, СекретныйКлюч)
    // Переводим секретный ключ и данные в двоичные данные (UTF-8)
    ДанныеКлюча = ПолучитьДвоичныеДанныеИзСтроки(СекретныйКлюч, КодировкаТекста.UTF8);
    ДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(СтрокаДанных, КодировкаТекста.UTF8);
    
    // Используем объект ХешированиеДанных
    Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
    // В 1С прямого метода HMAC в ХешированиеДанных нет, 
    // поэтому используем криптографию через менеджер криптографии 
    // или специализированные внешние компоненты.
    // Если работаем через системные вызовы:
    
    Менеджер = Новый МенеджерКриптографии("");
    ПодписьДвоичная = Менеджер.Зашифровать(ДанныеСтроки, ДанныеКлюча); // Утрированный пример
    
    // В реальности для HMAC в 1С часто используют COM-объекты (например, MSXML2) 
    // или функции платформы, если доступно расширение работы с криптографией.
    // Самый надежный способ - использование функции HMAC из состава БСП.
    
    MAC = Base64Строка(ПодписьДвоичная);
    Возврат MAC;
КонецФункции

Если в вашей конфигурации подключена Библиотека Стандартных Подсистем (БСП), рекомендуем использовать метод ОбщегоНазначения.ДанныеХешировать() или специализированные методы криптографии БСП для получения корректного HMAC.

Шаг 5. Сборка заголовка и отправка запроса

Когда все компоненты готовы, мы собираем финальную строку заголовка Authorization и отправляем HTTP-запрос. Посмотрим на пример кода:


// Формируем заголовок
СтрокаЗаголовка = "Hawk id=""" + ИдентификаторКлюча + """, "
                + "ts=""" + ТекущийTS + """, "
                + "nonce=""" + ТекущийNonce + """, "
                + "mac=""" + ВычисленныйMAC + """";

// Создаем HTTP-запрос
Запрос = Новый HTTPЗапрос(URI);
Запрос.Заголовки.Вставить("Authorization", СтрокаЗаголовка);
Запрос.Заголовки.Вставить("Content-Type", "application/json");

// Отправляем
Соединение = Новый HTTPСоединение(Хост, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Ответ = Соединение.ВызватьHTTPМетод(Метод, Запрос);

Если Ответ.КодСостояния = 200 Тогда
    Сообщить("Авторизация успешна!");
Иначе
    Сообщить("Ошибка: " + Ответ.КодСостояния);
    Сообщить(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;

Особенности работы с телом запроса (Payload)

Проанализируем ситуацию, когда вы отправляете данные (например, JSON в POST-запросе). Протокол Hawk позволяет проверять целостность тела запроса. Для этого в нормализованную строку вместо пустой строки (пункт 8) нужно вставить хеш самого тела.

Пошагово это выглядит так:

  1. Создается строка: hawk.1.payload + \n + Content-Type + \n + ТелоЗапроса + \n.
  2. Вычисляется хеш SHA256 от этой строки.
  3. Результат кодируется в Base64.
  4. Полученное значение вставляется в нормализованную строку для формирования итогового mac.

Если вы пропустите этот шаг при отправке данных, сервер, ожидающий проверку payload, выдаст ошибку подписи. Рассмотрим пример расчета хеша тела:


Функция ВычислитьХешТела(ТелоСтрокой, КонтентТип)
    СтрокаДляХеша = "hawk.1.payload" + Символы.ПС 
                  + КонтентТип + Символы.ПС 
                  + ТелоСтрокой + Символы.ПС;
    
    Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
    Хеширование.Добавить(СтрокаДляХеша);
    Возврат Base64Строка(Хеширование.ХешСумма);
КонецФункции

Типичные ошибки при реализации

Рассмотрим основные причины, по которым Hawk-авторизация в 1С может не срабатывать:

  1. Неверная кодировка: 1С по умолчанию может использовать UTF-16 или добавлять BOM (Byte Order Mark) к UTF-8. Убедитесь, что при получении двоичных данных используется КодировкаТекста.UTF8 и BOM отсутствует.
  2. Порт в нормализованной строке: если ваш URL выглядит как https://api.test.com/data, то порт в строке должен быть 443. Если вы укажете пустую строку вместо порта, подпись будет неверной.
  3. Лишние пробелы: нормализованная строка крайне чувствительна к лишним пробелам или отсутствию переноса строки в конце.
  4. Регистр символов: Метод (GET/POST) всегда должен быть в верхнем регистре, а Хост — в нижнем.

Для отладки мы рекомендуем использовать следующий метод: сформируйте нормализованную строку в 1С и выведите её в текстовый файл. Затем сделайте то же самое в Postman (вкладка Console позволяет увидеть детали запроса). Сравните две строки посимвольно в любом текстовом редакторе — это самый быстрый способ найти ошибку в структуре данных.

Таким образом, мы разобрали полный цикл реализации Hawk-авторизации: от подготовки временных меток до криптографического подписания запроса. Несмотря на кажущуюся сложность, четкое следование структуре нормализованной строки позволяет успешно интегрировать 1С с любыми современными API, использующими данный протокол.

← На главную