Как выполнить команду curl в 1С для авторизации по протоколу OAuth 2.0

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

При интеграции 1С с современными веб-сервисами программисты часто сталкиваются с документацией API, где примеры запросов приведены в формате консольной утилиты curl. Одной из самых распространенных задач является получение токена доступа по протоколу OAuth 2.0. В этой статье мы подробно разберем, как транслировать параметры команды curl в программный код 1С, используя встроенные механизмы работы с HTTP-запросами.

Анализ исходной команды curl

Рассмотрим типовой пример команды для получения токена:

curl -xpost -u "ИД_интеграции:СекретИнтеграции" -d "grant_type=client_credentials&scope=admin" https://api.service.net/oauth/token

Разберем, что означает каждый флаг, чтобы понимать, какие объекты 1С нам понадобятся:

  1. -xpost — указывает на использование метода POST.
  2. -u — задает данные для Basic Authentication (логин и пароль, разделенные двоеточием).
  3. -d (или --data) — передает данные в теле запроса. По умолчанию при использовании этого флага curl отправляет заголовок Content-Type: application/x-www-form-urlencoded.
  4. URL — адрес ресурса, состоящий из домена и пути к методу.

Шаг 1. Создание HTTP-соединения

Первым делом нам необходимо инициализировать объект HTTPСоединение. Важно помнить, что в качестве адреса сервера указывается только доменное имя без префикса https://. Также, если сервис работает через защищенный протокол, необходимо использовать объект ЗащищенноеСоединениеOpenSSL.

Проанализируем пример кода для создания соединения:


Сервер = "api.service.net"; // Только домен, без https://
Порт = 443;
Логин = "Ваш_ИД_Интеграции";
Пароль = "Ваш_Секрет_Интеграции";

Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , , Защита);

Важное примечание: Передача логина и пароля в конструктор HTTPСоединение автоматически формирует заголовок Authorization: Basic.... Однако некоторые строгие API требуют ручного формирования этого заголовка. В таком случае данные кодируются в Base64 и добавляются в объект запроса.

Шаг 2. Формирование HTTP-запроса

Теперь подготовим сам запрос. Нам нужно указать относительный путь к ресурсу (endpoint), установить правильный заголовок содержимого и наполнить тело запроса параметрами.

Рассмотрим, как это реализовать пошагово:

  1. Создаем объект HTTPЗапрос, указывая путь к методу (например, "/oauth/token").
  2. Устанавливаем заголовок Content-Type. Для OAuth-авторизации это почти всегда application/x-www-form-urlencoded.
  3. Помещаем параметры в тело запроса в виде строки.

Посмотрим на реализацию в коде:


ПутьКРесурсу = "/oauth/token";
Запрос = Новый HTTPЗапрос(ПутьКРесурсу);

// Устанавливаем заголовок, чтобы сервер понял формат передаваемых данных
Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");

// Формируем строку параметров (как в curl после флага -d)
СтрокаПараметров = "grant_type=client_credentials&scope=admin";
Запрос.УстановитьТелоИзСтроки(СтрокаПараметров, КодировкаТекста.UTF8);

Шаг 3. Выполнение запроса и обработка результата

После подготовки всех объектов вызываем метод POST. Крайне важно проанализировать ответ сервера, так как даже при технически успешном соединении сервер может вернуть ошибку авторизации или неверный формат данных.

Разберем процесс выполнения и проверки кода состояния:


Попытка
    Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
    
    КодСостояния = Ответ.КодСостояния;
    ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    Если КодСостояния = 200 Тогда
        // Успех, разбираем ответ (обычно JSON)
        Сообщить("Токен получен успешно!");
    Иначе
        Сообщить("Ошибка при получении токена. Код: " + КодСостояния);
        Сообщить("Текст ошибки: " + ТелоОтвета);
    КонецЕсли;
Исключение
    Сообщить("Произошла сетевая ошибка: " + ОписаниеОшибки());
КонецПопытки;

Шаг 4. Парсинг JSON-ответа

Как правило, в ответ на запрос авторизации приходит строка в формате JSON, содержащая поле access_token. Для работы с этими данными в 1С используем встроенные средства сериализации.

Проанализируем ситуацию извлечения токена:


ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Если ДанныеJSON.Свойство("access_token") Тогда
    ТокенДоступа = ДанныеJSON.access_token;
    // Теперь этот токен можно использовать в заголовках последующих запросов
    // Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
КонецЕсли;

Дополнительные рекомендации для надежности

Чтобы ваш код работал стабильно в различных условиях, выясним причины возможных сбоев и способы их устранения:

Альтернатива: Использование curl напрямую

В редких случаях, когда API использует специфические настройки (например, передачу клиентских сертификатов сложной структуры или редкие флаги прокси), проще выполнить команду через саму утилиту curl.exe, если она установлена в системе.

Выполним это с помощью метода ЗапуститьПриложение:


ПутьКФайлуРезультата = "C:\temp\answer.json";
КомандаЗапуска = "curl -xpost -u ""ID:Secret"" -d ""grant_type=client_credentials"" -o """ + ПутьКФайлуРезультата + """ https://api.service.net/oauth/token";

ЗапуститьПриложение(КомандаЗапуска, , Истина); // Истина — ждать завершения

// После выполнения читаем файл
ТекстОтвета = Новый ТекстовыйДокумент();
ТекстОтвета.Прочитать(ПутьКФайлуРезультата);
Результат = ТекстОтвета.ПолучитьТекст();

Однако штатный метод через HTTPСоединение является более предпочтительным, так как он платформонезависим и работает быстрее за счет отсутствия обращения к файловой системе и внешним процессам.

← На главную