При интеграции 1С с современными веб-сервисами и сайтами через API одной из первоочередных задач становится реализация механизма авторизации. Чаще всего разработчики используют Token-based authentication. В этой статье мы подробно разберем, как правильно организовать двухэтапный процесс работы с API: получение токена доступа и его последующую передачу в запросах для обмена данными.
Рассмотрим стандартную схему взаимодействия. В отличие от простой передачи логина и пароля в каждом запросе, работа через токены подразумевает разделение процесса на два этапа. Сначала мы «представляемся» серверу, отправляя свои учетные данные, и получаем в ответ уникальную строку — токен. В дальнейшем этот токен служит нашим цифровым пропуском. Проанализируем ситуацию на примере кода: сначала мы обращаемся к ресурсу /login, а после успешного получения ключа работаем с основным ресурсом, например /todo или /orders.
Выясним причину, по которой нельзя сразу отправлять данные заказа. Без авторизации сервер отклонит запрос с ошибкой 401 (Unauthorized). Для получения токена нам необходимо сформировать JSON-объект с логином и паролем. Разберем по шагам, как это реализовать в 1С.
Для начала подготовим данные для отправки. Согласно документации API, сервер ожидает структуру следующего вида:
{
"login": "ваш_логин",
"password": "ваш_пароль"
}
Реализуем это в коде 1С, используя объект ЗаписьJSON и HTTPСоединение. Обратите внимание на важность использования защищенного соединения OpenSSL, так как мы передаем конфиденциальные данные в открытом виде внутри JSON.
// Настройка защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.site.com", 443, , , , 5, Защита);
// Формируем структуру для авторизации
СтруктураАвторизации = Новый Структура;
СтруктураАвторизации.Вставить("login", "admin");
СтруктураАвторизации.Вставить("password", "p@ssword123");
// Преобразуем структуру в строку JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураАвторизации);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Подготовка HTTP-запроса
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
Запрос = Новый HTTPЗапрос("/api/login", Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
// Отправка запроса и получение ответа
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
После отправки запроса нам нужно проанализировать ответ сервера. Если авторизация прошла успешно, сервер вернет JSON, содержащий токен. Посмотрим на пример обработки такого ответа:
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Если ДанныеОтвета.success Тогда
ТокенДоступа = ДанныеОтвета.token;
Сообщить("Авторизация успешна. Токен получен.");
Иначе
Сообщить("Сервер вернул ошибку: " + ДанныеОтвета.message);
Возврат;
КонецЕсли;
Иначе
Сообщить("Ошибка связи с сервером. Код состояния: " + Ответ.КодСостояния);
Возврат;
КонецЕсли;
Теперь, когда у нас есть ТокенДоступа, мы можем использовать его для отправки данных, например, информации о заказах. Рассмотрим важный технический нюанс: в большинстве современных систем используется стандарт Bearer Token. Это означает, что токен нужно передавать в заголовке Authorization с префиксом Bearer.
Проанализируем пример формирования запроса на отправку данных заказа с использованием полученного токена:
// Подготовка данных заказа (как в вашем исходном коде)
мЗаказ = Заказ.ПолучитьОбъект();
мДата = новый Структура;
мДата.Вставить("doc", мЗаказ.Ответственный.Наименование);
мТЧ = Новый Массив;
Для каждого Анализ Из мЗаказ.МедицинскиеУслуги Цикл
сТЧ = Новый Структура;
сТЧ.Вставить("analys_code", Анализ.Номенклатура.Артикул);
мТЧ.Добавить(сТЧ);
КонецЦикла;
мДата.Вставить("analyses", мТЧ);
// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, мДата);
СтрокаДляОтвета = ЗаписьJSON.Закрыть();
// Формирование заголовков с токеном
ЗаголовкиЗаказа = Новый Соответствие;
ЗаголовкиЗаказа.Вставить("Content-Type", "application/json");
// ВАЖНО: Добавляем авторизационный токен
ЗаголовкиЗаказа.Вставить("Authorization", "Bearer " + ТокенДоступа);
// Создание запроса к рабочему ресурсу
ЗапросРабочий = Новый HTTPЗапрос("/api/todo", ЗаголовкиЗаказа);
ЗапросРабочий.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8);
// Отправка данных
РезультатЗапроса = Соединение.ОтправитьДляОбработки(ЗапросРабочий);
Если РезультатЗапроса.КодСостояния = 201 Тогда
Сообщить("Данные успешно отправлены на сайт.");
КонецЕсли;
Рассмотрим подробнее вопросы производительности и стабильности интеграции. Постоянно запрашивать токен перед каждой отправкой данных — плохая практика, так как это создает лишнюю нагрузку на сервер и замедляет работу 1С. Разберем, как оптимизировать этот процесс:
ПараметрыСеанса. Если запросы идут через регламентные задания, лучше сохранять токен в Константы или специальный РегистрСведений.Иногда API предоставляет два типа токенов: access_token (для работы) и refresh_token (для обновления первого без ввода пароля). В 1С это реализуется аналогично: если основной токен просрочен, вы отправляете запрос на специальный адрес, передавая refresh_token, и получаете новую пару ключей. Это повышает безопасность, так как логин и пароль используются крайне редко.
Подводя итог, отметим, что ключевым моментом является правильное использование объекта HTTPЗапрос и коллекции Заголовки. Всегда проверяйте документацию конкретного API, так как названия полей в JSON (например, token, access_token или jwt) могут отличаться, но общий принцип работы остается неизменным.