Как выполнить HTTP-запрос с логином и паролем в 1С, если стандартная авторизация не работает

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

Часто при интеграции 1С с внешними сайтами программисты сталкиваются с ситуацией, когда указание логина и пароля непосредственно в конструкторе объекта HTTPСоединение не приносит результата. Вместо ожидаемых данных сервер возвращает ошибку 401 (Unauthorized) или, что еще более коварно, 301/302 редирект на страницу авторизации. Разберем по шагам, почему так происходит и как правильно реализовать программный вход на сайт.

Анализируем причину ошибки: Basic Auth против Form-based Auth

Проанализируем ситуацию: в стандартном конструкторе 1С Новый HTTPСоединение("адрес", , "Логин", "Пароль") параметры авторизации предназначены для так называемой Basic Authentication. Это метод, при котором браузер или клиент передает учетные данные в заголовке запроса Authorization в зашифрованном (Base64) виде. Этот метод работает на уровне веб-сервера (например, Apache или Nginx).

Однако современные сайты и платформы (такие как ABCP) чаще используют Form-based Authentication. В этом случае на сайте есть реальная форма с полями "Логин" и "Пароль", и сервер ожидает, что эти данные придут в теле POST-запроса. Если вы попытаетесь использовать стандартные параметры соединения, сервер их просто проигнорирует, так как ищет переменные внутри тела сообщения.

Шаг 1: Правильное создание HTTP-соединения

Для работы с сайтами, требующими авторизации через форму, мы создаем HTTPСоединение без указания логина и пароля в параметрах. При этом крайне важно правильно настроить защищенное соединение (SSL), так как передача паролей должна идти через шифрованный канал.

Посмотрим на пример правильной инициализации соединения:


// Инициализируем защищенное соединение
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// Создаем соединение без логина и пароля в конструкторе
Соединение = Новый HTTPСоединение("cp.abcp.ru", 443, , , , 20, Защита);

Шаг 2: Формирование POST-запроса для авторизации

Теперь выясним, как передать учетные данные. Нам необходимо имитировать поведение пользователя, нажимающего кнопку "Войти" на сайте. Для этого используется метод POST и специальный заголовок Content-Type со значением application/x-www-form-urlencoded. Это сообщает серверу, что данные в теле запроса передаются в формате пар "ключ=значение".

Рассмотрим пример формирования запроса:


// Создаем соответствие для заголовков
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");

// Создаем объект запроса, указывая путь к скрипту авторизации (часто это корень "/" или "/login")
ЗапросАвторизации = Новый HTTPRequest("/", Заголовки);

// Формируем строку с данными. 
// Внимание: имена параметров (login, pass) должны точно соответствовать именам полей в HTML-форме сайта!
СтрокаПараметров = "login_start=1&login=ВашЛогин&pass=ВашПароль";
ЗапросАвторизации.УстановитьТелоИзСтроки(СтрокаПараметров, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

// Отправляем запрос
Результат = Соединение.ОтправитьДляОбработки(ЗапросАвторизации);

Обратите внимание на важный нюанс: в некоторых конфигурациях веб-серверов или специфических PHP-скриптах (как в случае с ABCP) строка параметров может требовать символ & в самом начале, даже если это первый параметр. Это не является стандартом RFC, но часто помогает обойти ошибки парсинга на стороне сервера.

Шаг 3: Обработка ответа и работа с Cookies

После выполнения POST-запроса вы, скорее всего, получите ответ с кодом 301 или 302. В данном контексте это хороший знак: сервер проверил логин/пароль и пытается перенаправить вас в личный кабинет. Однако 1С не сохраняет состояние авторизации автоматически. Чтобы последующие запросы к данным (например, к /xml или /api) были успешными, нам нужно работать с сессионными куками (Cookies).

Проанализируем алгоритм работы с сессией:

  1. Сервер в ответ на успешный логин присылает заголовок Set-Cookie.
  2. Нам нужно извлечь значение этой куки (например, PHPSESSID=...).
  3. В каждом следующем запросе к серверу мы обязаны добавлять заголовок Cookie с полученным значением.

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


Куки = Результат.Заголовки.Получить("Set-Cookie");
Если Куки <> Неопределено Тогда
    // Теперь эту строку нужно добавлять в последующие запросы
    ЗапросДанных = Новый HTTPЗапрос("/xml");
    ЗапросДанных.Заголовки.Вставить("Cookie", Куки);
    ОтветСДанными = Соединение.Получить(ЗапросДанных);
КонецЕсли;

Безопасность и SSL

Важно помнить о безопасности. Существует соблазн передавать логин и пароль прямо в URL-строке (GET-запрос), например: https://site.ru?user=admin&pass=123. Никогда так не делайте. Даже при использовании SSL (HTTPS), который шифрует весь трафик, URL-адреса часто сохраняются в открытом виде в логах веб-серверов, прокси-серверов и в истории браузеров. Использование тела POST-запроса (как мы разобрали выше) является гораздо более защищенным методом, так как тело запроса внутри SSL-туннеля полностью зашифровано.

Резюме

Для успешной авторизации в 1С через HTTP выполните следующие действия:

Если вы продолжаете получать 301 редирект на страницу логина после всех манипуляций, проверьте правильность имен полей (login/pass/email) — их можно подсмотреть в исходном коде страницы авторизации сайта или через инструменты разработчика в браузере (вкладка Network).

← На главную