Как реализовать авторизацию по токену при интеграции 1С с веб-сайтом

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

При интеграции 1С с современными веб-сервисами и сайтами через API одной из первоочередных задач становится реализация механизма авторизации. Чаще всего разработчики используют Token-based authentication. В этой статье мы подробно разберем, как правильно организовать двухэтапный процесс работы с API: получение токена доступа и его последующую передачу в запросах для обмена данными.

Общая концепция работы с токенами

Рассмотрим стандартную схему взаимодействия. В отличие от простой передачи логина и пароля в каждом запросе, работа через токены подразумевает разделение процесса на два этапа. Сначала мы «представляемся» серверу, отправляя свои учетные данные, и получаем в ответ уникальную строку — токен. В дальнейшем этот токен служит нашим цифровым пропуском. Проанализируем ситуацию на примере кода: сначала мы обращаемся к ресурсу /login, а после успешного получения ключа работаем с основным ресурсом, например /todo или /orders.

Этап 1: Получение токена авторизации

Выясним причину, по которой нельзя сразу отправлять данные заказа. Без авторизации сервер отклонит запрос с ошибкой 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-ответа от сервера

После отправки запроса нам нужно проанализировать ответ сервера. Если авторизация прошла успешно, сервер вернет JSON, содержащий токен. Посмотрим на пример обработки такого ответа:


Если Ответ.КодСостояния = 200 Тогда
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Если ДанныеОтвета.success Тогда
        ТокенДоступа = ДанныеОтвета.token;
        Сообщить("Авторизация успешна. Токен получен.");
    Иначе
        Сообщить("Сервер вернул ошибку: " + ДанныеОтвета.message);
        Возврат;
    КонецЕсли;
Иначе
    Сообщить("Ошибка связи с сервером. Код состояния: " + Ответ.КодСостояния);
    Возврат;
КонецЕсли;

Этап 2: Использование токена в основных запросах

Теперь, когда у нас есть ТокенДоступа, мы можем использовать его для отправки данных, например, информации о заказах. Рассмотрим важный технический нюанс: в большинстве современных систем используется стандарт 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С. Разберем, как оптимизировать этот процесс:

  1. Кэширование токена: Полученный токен следует сохранить. Если интеграция выполняется в рамках одного сеанса пользователя, можно использовать ПараметрыСеанса. Если запросы идут через регламентные задания, лучше сохранять токен в Константы или специальный РегистрСведений.
  2. Проверка срока жизни (TTL): Токены имеют ограничение по времени действия. В коде 1С желательно хранить дату получения токена. Если с момента получения прошло более часа (или другого срока, установленного API), следует инициировать процедуру переавторизации.
  3. Обработка ошибки 401: Если сервер вернул код 401 при использовании сохраненного токена, ваша функция-обертка должна автоматически вызвать процедуру логина, получить новый токен и повторить исходный запрос.

Использование Refresh Token

Иногда API предоставляет два типа токенов: access_token (для работы) и refresh_token (для обновления первого без ввода пароля). В 1С это реализуется аналогично: если основной токен просрочен, вы отправляете запрос на специальный адрес, передавая refresh_token, и получаете новую пару ключей. Это повышает безопасность, так как логин и пароль используются крайне редко.

Подводя итог, отметим, что ключевым моментом является правильное использование объекта HTTPЗапрос и коллекции Заголовки. Всегда проверяйте документацию конкретного API, так как названия полей в JSON (например, token, access_token или jwt) могут отличаться, но общий принцип работы остается неизменным.

← На главную