Авторизация по протоколу Hawk является современным и безопасным способом взаимодействия между клиентом и сервером. В отличие от базовой авторизации, здесь не передаются пароли в открытом виде. Вместо этого используется механизм создания симметричной подписи сообщения. Рассмотрим подробнее, как реализовать этот алгоритм в среде 1С:Предприятие, используя встроенные средства криптографии и работы с HTTP-запросами.
Проанализируем основные компоненты, которые нам потребуются для успешного прохождения проверки на сервере. Согласно документации протокола, заголовок Authorization должен содержать следующие поля:
Выясним причину, по которой обычное копирование заголовка из Postman не работает: параметры ts, nonce и mac должны генерироваться заново для каждого нового запроса. Если сервер получит запрос с устаревшим ts или уже использованным ранее nonce, он вернет ошибку 401.
Разберем, как получить значение ts. В 1С нет встроенной функции для получения времени в формате UNIX, но мы можем легко вычислить его самостоятельно. Разберем пример кода:
Функция ПолучитьUnixВремя()
НачалоЭпохи = Дата(1970, 1, 1, 0, 0, 0);
ТекущееВремяУниверсальное = ТекущаяУниверсальнаяДата();
Возврат Формат(ТекущееВремяУниверсальное - НачалоЭпохи, "ЧГ=0");
КонецФункции
Важно использовать именно ТекущаяУниверсальнаяДата(), так как время в Hawk всегда должно быть по Гринвичу (UTC). Разница во времени между сервером 1С и целевым сервером более чем на несколько минут приведет к отказу в авторизации.
Для создания nonce нам подойдет любая случайная строка. Проще всего использовать часть уникального идентификатора. Посмотрим на пример реализации:
Функция СгенерироватьNonce()
УИД = Строка(Новый УникальныйИдентификатор);
// Возьмем первые 6 символов GUID для краткости
Возврат Сред(СтрЗаменить(УИД, "-", ""), 1, 6);
КонецФункции
Это самый ответственный этап. Чтобы сервер смог проверить вашу подпись, вы должны собрать строку данных в строго определенном порядке. Проанализируем структуру нормализованной строки для заголовка:
hawk.1.header/api/v1/data)example.com)443 для HTTPS или 80 для HTTP)Каждый элемент должен отделяться символом переноса строки \n. Рассмотрим подробнее код сборки этой строки в 1С:
// Предположим, у нас есть переменные:
// Метод = "POST", URI = "/api/resource", Хост = "api.mysite.com", Порт = "443"
НормализованнаяСтрока = "hawk.1.header" + Символы.ПС
+ ТекущийTS + Символы.ПС
+ ТекущийNonce + Символы.ПС
+ ВРег(Метод) + Символы.ПС
+ URI + Символы.ПС
+ НРег(Хост) + Символы.ПС
+ Порт + Символы.ПС
+ "" + Символы.ПС // Здесь мог быть хеш тела запроса
+ "" + Символы.ПС; // Дополнительные данные
Важный момент: в конце нормализованной строки обязательно должен присутствовать завершающий символ переноса строки.
Теперь нам необходимо подписать полученную строку с помощью 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.
Когда все компоненты готовы, мы собираем финальную строку заголовка Authorization и отправляем HTTP-запрос. Посмотрим на пример кода:
// Формируем заголовок
СтрокаЗаголовка = "Hawk id=""" + ИдентификаторКлюча + """, "
+ "ts=""" + ТекущийTS + """, "
+ "nonce=""" + ТекущийNonce + """, "
+ "mac=""" + ВычисленныйMAC + """";
// Создаем HTTP-запрос
Запрос = Новый HTTPЗапрос(URI);
Запрос.Заголовки.Вставить("Authorization", СтрокаЗаголовка);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
// Отправляем
Соединение = Новый HTTPСоединение(Хост, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Ответ = Соединение.ВызватьHTTPМетод(Метод, Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Авторизация успешна!");
Иначе
Сообщить("Ошибка: " + Ответ.КодСостояния);
Сообщить(Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Проанализируем ситуацию, когда вы отправляете данные (например, JSON в POST-запросе). Протокол Hawk позволяет проверять целостность тела запроса. Для этого в нормализованную строку вместо пустой строки (пункт 8) нужно вставить хеш самого тела.
Пошагово это выглядит так:
hawk.1.payload + \n + Content-Type + \n + ТелоЗапроса + \n.mac.Если вы пропустите этот шаг при отправке данных, сервер, ожидающий проверку payload, выдаст ошибку подписи. Рассмотрим пример расчета хеша тела:
Функция ВычислитьХешТела(ТелоСтрокой, КонтентТип)
СтрокаДляХеша = "hawk.1.payload" + Символы.ПС
+ КонтентТип + Символы.ПС
+ ТелоСтрокой + Символы.ПС;
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеширование.Добавить(СтрокаДляХеша);
Возврат Base64Строка(Хеширование.ХешСумма);
КонецФункции
Рассмотрим основные причины, по которым Hawk-авторизация в 1С может не срабатывать:
КодировкаТекста.UTF8 и BOM отсутствует.https://api.test.com/data, то порт в строке должен быть 443. Если вы укажете пустую строку вместо порта, подпись будет неверной.Для отладки мы рекомендуем использовать следующий метод: сформируйте нормализованную строку в 1С и выведите её в текстовый файл. Затем сделайте то же самое в Postman (вкладка Console позволяет увидеть детали запроса). Сравните две строки посимвольно в любом текстовом редакторе — это самый быстрый способ найти ошибку в структуре данных.
Таким образом, мы разобрали полный цикл реализации Hawk-авторизации: от подготовки временных меток до криптографического подписания запроса. Несмотря на кажущуюся сложность, четкое следование структуре нормализованной строки позволяет успешно интегрировать 1С с любыми современными API, использующими данный протокол.