При работе с внешними API или интеграции двух баз 1С через HTTP-сервисы одной из самых частых проблем является ошибка 401 Unauthorized. Несмотря на наличие логина и пароля, сервер может упорно отклонять запросы. В рамках данной статьи мы разберем, как правильно передавать учетные данные, настроить веб-сервер и избежать типичных ошибок при формировании заголовков, а закрепить знания поможет HTTP-QUEST: интерактивный обучающий курс для работы с HTTP-запросами.
Прежде чем приступать к ручному формированию сложных заголовков, рассмотрим самый простой и надежный метод, заложенный в платформу 1С. При создании объекта HTTPСоединение мы можем передать логин и пароль в качестве параметров. Платформа самостоятельно сформирует необходимые заголовки и выполнит кодирование в Base64.
Проанализируем пример кода:
Сервер = "api.mysite.ru";
Порт = 443;
Логин = "web_user";
Пароль = "SecretPass123";
// Использование защищенного соединения обязательно для HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Передаем логин и пароль прямо в конструктор
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , , ЗащищенноеСоединение);
Важно понимать: если вы указываете логин и пароль в конструкторе HTTPСоединение, вам не нужно вручную добавлять заголовок Authorization в объект HTTPЗапрос. Повторная передача или дублирование может привести к конфликту и ошибке авторизации на стороне сервера.
Бывают ситуации, когда логика приложения требует явного указания заголовков или использования специфических методов аутентификации. В этом случае мы используем стандарт Basic Authentication. Рассмотрим по шагам, как правильно подготовить строку авторизации, для чего также может пригодиться специализированная обработка Тестирование http сервисов (GET и POST).
Выясним причину, по которой ручной метод часто не срабатывает. Основная ошибка заключается в использовании заголовка WWW-Authenticate вместо Authorization. Помним правило: WWW-Authenticate присылает сервер, а клиент (наша 1С) должен отвечать заголовком Authorization.
Разберем корректный пример формирования запроса:
ИмяПользователя = "admin";
ПарольПользователя = "p@ssword";
// Формируем строку "Логин:Пароль"
СтрокаАвторизации = ИмяПользователя + ":" + ПарольПользователя;
// Кодируем в Base64. Важно использовать UTF-8 без BOM!
ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(СтрокаАвторизации, КодировкаТекста.UTF8, Ложь);
Base64Авторизация = ПолучитьBase64СтрокуИзДвоичныхДанных(ДвоичныеДанныеСтроки);
Запрос = Новый HTTPЗапрос("/hs/my_service/v1/get_data");
Запрос.Заголовки.Вставить("Authorization", "Basic " + Base64Авторизация);
// Теперь выполняем запрос через соединение без логина/пароля в конструкторе
Соединение = Новый HTTPСоединение("myserver.ru");
Ответ = Соединение.Получить(Запрос);
Обратите внимание на использование метода ПолучитьДвоичныеДанныеИзСтроки. Если ваш логин содержит кириллицу (хотя это не рекомендуется), обязательное указание кодировки UTF8 является критически важным для успешной проверки подлинности на стороне сервера.
Если код написан верно, но сервер продолжает возвращать код 401, проблему следует искать в настройках публикации 1С. Рассмотрим ситуацию на примере Internet Information Services (IIS).
Парадокс настройки IIS для 1С заключается в следующем: для того чтобы 1С сама могла обрабатывать заголовки Authorization, в настройках IIS для конкретной виртуальной директории должна быть включена Анонимная проверка подлинности (Anonymous Authentication). Если вы включите только «Проверку подлинности Windows», IIS перехватит запрос раньше, чем он попадет в 1С, и будет ждать доменного пользователя, отвергая Basic Auth из кода.
Проанализируем основные шаги проверки веб-сервера:
Для веб-сервера Apache убедитесь, что в конфигурационном файле разрешена передача заголовков авторизации в CGI-приложения. Часто требуется добавить директиву SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 в файл .htaccess или конфигурацию виртуального хоста.
Файл default.vrd управляет параметрами публикации базы 1С. Если вы жестко прописали параметры usr и pwd внутри этого файла, то любые попытки авторизоваться под другим пользователем из кода могут игнорироваться или приводить к ошибкам, так как сервер всегда будет пытаться зайти под «зашитыми» данными.
Рассмотрим структуру правильной секции в .vrd, если мы хотим передавать логин/пароль извне:
<httpServices>
<service name="MyService" rootUrl="my_service" enable="true" reuseSessions="autouse"/>
</httpServices>
Если в строке соединения ib="..." указаны параметры usr или pwd, попробуйте их удалить для тестирования авторизации из кода.
Даже при правильном логине и пароле 1С вернет 401, если у пользователя нет прав. Выясним, что нужно проверить в конфигураторе:
Использование для конкретного HTTP-сервиса.ИмяПользователя@ОбластьДанных или соответствующие заголовки области указаны в запросе.Посмотрим на ситуацию глазами системного администратора. Чтобы точно определить, виноват ли код 1С или настройки сервера, воспользуйтесь сторонней утилитой, например Postman или cURL. Попробуйте выполнить запрос с аналогичными заголовками. Если сторонний клиент получает доступ, значит, ошибка кроется в формировании Base64 или двоичных данных в коде 1С. Если же и Postman получает 401 — проблема однозначно в настройках IIS/Apache или публикации .vrd.