Интеграция 1С с внешними сайтами, личными кабинетами и веб-сервисами часто начинается с этапа аутентификации. В зависимости от архитектуры веб-ресурса процесс авторизации может кардинально отличаться: от простой передачи логина и пароля в заголовках до обработки веб-форм с сохранением сессионных cookie. Разберем подробно, как правильно настроить подключение из 1С, отправить учетные данные и сохранить состояние для дальнейших запросов.
Перед написанием программного кода выясним, какой именно механизм защиты используется на целевом сайте:
Authorization. В 1С для этого достаточно передать логин и пароль в конструктор объекта HTTPСоединение.application/x-www-form-urlencoded, а сервер возвращает идентификатор сессии в заголовке Set-Cookie. Параметры логина и пароля в конструкторе HTTPСоединение в этом случае не сработают.Authorization: Bearer <токен> во всех последующих обращениях.Рассмотрим случай, когда сервер запрашивает учетные данные на уровне HTTP-сервера. Для этого указываем логин и пароль непосредственно в конструкторе объекта HTTPСоединение. Для защищенного протокола HTTPS также инициализируем защищенное соединение.
Посмотрим на пример кода:
Сервер = "api.example.com";
Логин = "admin";
Пароль = "secret_pass";
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443, Логин, Пароль,,, Защита);
Запрос = Новый HTTPЗапрос("/api/v1/data");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
// Обработка полученных данных
Иначе
ВызватьИсключение "Ошибка запроса. Код: " + Ответ.КодСостояния;
КонецЕсли;
Если сайт использует стандартную форму входа (например, скрипты авторизации на PHP или ASPX), передача учетных данных в конструктор не приведет к успеху. Разберем по шагам, как эмулировать отправку веб-формы:
КодироватьСтроку со способом СпособКодированияСтроки.КодировкаURL.Content-Type: application/x-www-form-urlencoded.ОтправитьДляОбработки или POST.Set-Cookie.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 (как в вопросе с login.aspx) передать только логин и пароль недостаточно. ASP.NET требует наличия скрытых системных параметров страницы.
Разберем обязательный алгоритм для страниц ASPX:
/login.aspx).__VIEWSTATE, __EVENTVALIDATION, __VIEWSTATEGENERATOR (а также возможные CSRF-токены)..ASPXAUTH).Важно помнить: статус 200 OK не является подтверждением успешного входа! Если логин или пароль указаны неверно, либо не переданы обязательные поля формы, сервер вернет ту же самую страницу авторизации со статусом 200.
Проверить результат можно по следующим признакам:
302 Found или 303 See Other с адресом личного кабинета в заголовке Location.Set-Cookie должен появиться уникальный идентификатор сессии (например, PHPSESSID, JSESSIONID, .ASPXAUTH, session_id).Ответ.ПолучитьТелоКакСтроку(), должны отсутствовать поля ввода логина и пароля и присутствовать элементы личного кабинета.C:\1.xls приведет к ошибке прав доступа, особенно при выполнении кода на стороне сервера 1С. Всегда используйте ПолучитьТелоКакСтроку() / ПолучитьТелоКакДвоичныеДанные() для работы в оперативной памяти либо функцию ПолучитьИмяВременногоФайла(), если требуется запись на диск.Content-Type: application/x-www-form-urlencoded или application/json в зависимости от требований API.?tbLogin=...&tbPassword=... не является стандартным способом авторизации через веб-форму и небезопасна, так как логин и пароль сохраняются в логах прокси-серверов и веб-сервера.