Как авторизоваться на сайте из 1С для дальнейшей работы?

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

Интеграция 1С с внешними сайтами, личными кабинетами и веб-сервисами часто начинается с этапа аутентификации. В зависимости от архитектуры веб-ресурса процесс авторизации может кардинально отличаться: от простой передачи логина и пароля в заголовках до обработки веб-форм с сохранением сессионных cookie. Разберем подробно, как правильно настроить подключение из 1С, отправить учетные данные и сохранить состояние для дальнейших запросов.

Определение типа авторизации на веб-ресурсе

Перед написанием программного кода выясним, какой именно механизм защиты используется на целевом сайте:

  1. HTTP Basic / Digest / NTLM: Учетные данные передаются непосредственно на уровне протокола HTTP в заголовке Authorization. В 1С для этого достаточно передать логин и пароль в конструктор объекта HTTPСоединение.
  2. Авторизация через веб-форму (Form-based / Cookies): Пользователь вводит логин и пароль в HTML-форму, отправляется POST-запрос с телом формата application/x-www-form-urlencoded, а сервер возвращает идентификатор сессии в заголовке Set-Cookie. Параметры логина и пароля в конструкторе HTTPСоединение в этом случае не сработают.
  3. Токены (Bearer / JWT / API Key): Логин и пароль (или ключ доступа) передаются POST-запросом к эндпоинту API, в ответ возвращается токен, который необходимо подставлять в заголовок Authorization: Bearer <токен> во всех последующих обращениях.

Вариант 1. Базовая HTTP-авторизация (Basic Auth)

Рассмотрим случай, когда сервер запрашивает учетные данные на уровне HTTP-сервера. Для этого указываем логин и пароль непосредственно в конструкторе объекта HTTPСоединение. Для защищенного протокола HTTPS также инициализируем защищенное соединение.

Посмотрим на пример кода:


Сервер = "api.example.com";
Логин = "admin";
Пароль = "secret_pass";

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

Запрос = Новый HTTPЗапрос("/api/v1/data");
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
    // Обработка полученных данных
Иначе
    ВызватьИсключение "Ошибка запроса. Код: " + Ответ.КодСостояния;
КонецЕсли;

Вариант 2. Авторизация через форму (POST-запрос и работа с Cookies)

Если сайт использует стандартную форму входа (например, скрипты авторизации на PHP или ASPX), передача учетных данных в конструктор не приведет к успеху. Разберем по шагам, как эмулировать отправку веб-формы:

  1. Формируем тело POST-запроса с учетными данными. Все значения параметров формы обязательно кодируем функцией КодироватьСтроку со способом СпособКодированияСтроки.КодировкаURL.
  2. Устанавливаем заголовок Content-Type: application/x-www-form-urlencoded.
  3. Отправляем POST-запрос методом ОтправитьДляОбработки или POST.
  4. Извлекаем сессионные куки из заголовка ответа Set-Cookie.
  5. Передаем полученные куки в заголовке Cookie каждого последующего запроса.

Проанализируем пример авторизации и последующего выполнения закрытого запроса:


Сервер = "site.example.com";
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443,,,,, Защита);

// 1. Формируем тело запроса для входа
Логин = "user@example.com";
Пароль = "P@ssw0rd";

ТелоЗапроса = "login=" + КодироватьСтроку(Логин, СпособКодированияСтроки.КодировкаURL)
    + "&password=" + КодироватьСтроку(Пароль, СпособКодированияСтроки.КодировкаURL);

ЗапросАвторизации = Новый HTTPЗапрос("/login.php");
ЗапросАвторизации.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
ЗапросАвторизации.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

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

// 2. Получаем идентификатор сессии из заголовков
Куки = "";
Если ОтветАвторизации.Заголовки.Свойство("Set-Cookie", Куки) Тогда
    // Заголовок может содержать несколько параметров через точку с запятой
    // Оставляем только нужные ключи сессии
    ПозицияТочкиСЗапятой = СтрНайти(Куки, ";");
    Если ПозицияТочкиСЗапятой > 0 Тогда
        Куки = Лев(Куки, ПозицияТочкиСЗапятой - 1);
    КонецЕсли;
КонецЕсли;

// 3. Выполняем рабочий запрос к закрытому разделу с передачей Cookie
ЗапросДанных = Новый HTTPЗапрос("/cabinet/reports");
Если Не ПустаяСтрока(Куки) Тогда
    ЗапросДанных.Заголовки.Вставить("Cookie", Куки);
КонецЕсли;

ОтветДанных = Соединение.Получить(ЗапросДанных);
ТекстСтраницы = ОтветДанных.ПолучитьТелоКакСтроку();

Особенности авторизации на ASP.NET (страницы .aspx)

При работе с веб-формами ASP.NET (как в вопросе с login.aspx) передать только логин и пароль недостаточно. ASP.NET требует наличия скрытых системных параметров страницы.

Разберем обязательный алгоритм для страниц ASPX:

  1. Выполняем предварительный GET-запрос к странице входа (/login.aspx).
  2. Анализируем полученный HTML-код и парсим скрытые поля формы: __VIEWSTATE, __EVENTVALIDATION, __VIEWSTATEGENERATOR (а также возможные CSRF-токены).
  3. Формируем итоговый POST-запрос, в который включаем как учетные данные пользователя, так и все найденные скрытые поля.
  4. Сохраняем возвращенный cookie аутентификации (обычно с именем .ASPXAUTH).

Как проверить успешность авторизации?

Важно помнить: статус 200 OK не является подтверждением успешного входа! Если логин или пароль указаны неверно, либо не переданы обязательные поля формы, сервер вернет ту же самую страницу авторизации со статусом 200.

Проверить результат можно по следующим признакам:

  1. Перенаправление (Redirect): Успешный вход часто возвращает статус 302 Found или 303 See Other с адресом личного кабинета в заголовке Location.
  2. Наличие авторизационных Cookie: В заголовке Set-Cookie должен появиться уникальный идентификатор сессии (например, PHPSESSID, JSESSIONID, .ASPXAUTH, session_id).
  3. Анализ содержимого ответа: В теле ответа, полученном через Ответ.ПолучитьТелоКакСтроку(), должны отсутствовать поля ввода логина и пароля и присутствовать элементы личного кабинета.

Типичные ошибки при реализации HTTP-запросов

  1. Сохранение временных файлов в корень диска: Указание путей вида C:\1.xls приведет к ошибке прав доступа, особенно при выполнении кода на стороне сервера 1С. Всегда используйте ПолучитьТелоКакСтроку() / ПолучитьТелоКакДвоичныеДанные() для работы в оперативной памяти либо функцию ПолучитьИмяВременногоФайла(), если требуется запись на диск.
  2. Отсутствие заголовка кодировки формы: При отправке POST-запросов обязательно указывайте Content-Type: application/x-www-form-urlencoded или application/json в зависимости от требований API.
  3. Передача логина и пароля в строке URL (GET-параметры): Передача учетных данных через строку запроса ?tbLogin=...&tbPassword=... не является стандартным способом авторизации через веб-форму и небезопасна, так как логин и пароль сохраняются в логах прокси-серверов и веб-сервера.
← На главную