Как реализовать авторизацию на JavaScript для обращения к HTTP-сервису 1С и устранить ошибку 401?

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

При разработке веб-интерфейсов, которые должны взаимодействовать с данными 1С напрямую, программисты часто сталкиваются с проблемой безопасности и авторизации. Типичная ситуация: вы пишете fetch запрос на JavaScript, передаете корректные логин и пароль, но браузер возвращает ошибку 401 Unauthorized или блокирует запрос из-за политики CORS. Разберем подробно, как правильно настроить обе стороны — и ваш JavaScript-код, и публикацию 1С на веб-сервере.

Анализируем типичные ошибки в JavaScript-коде

Рассмотрим исходный вариант кода, который часто приводит к неудаче. Основная проблема здесь заключается в использовании режима mode: 'no-cors'. Многие разработчики включают его, чтобы «заглушить» ошибки кросс-доменных запросов, но это лишает запрос возможности передавать заголовки авторизации.

Выясним причину: режим no-cors превращает запрос в «непрозрачный» (opaque), при котором браузер намеренно ограничивает доступ к заголовкам, включая Authorization. В итоге 1С получает пустой запрос без учетных данных и закономерно возвращает 401 ошибку.

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


async function sendData(url, login, password) {
    const data = JSON.stringify({ login: login, password: password });
    
    // Формируем строку Basic авторизации
    // Внимание: btoa работает корректно только с латиницей!
    const authHeader = 'Basic ' + btoa(login + ':' + password);

    try {
        const response = await fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': authHeader
            },
            body: data,
            // credentials: 'omit' или 'include' в зависимости от настроек CORS
            credentials: 'omit' 
        });

        if (!response.ok) {
            throw new Error('Ошибка сервера: ' + response.status);
        }

        return await response.json();
    } catch (error) {
        console.error('Ошибка при запросе:', error);
        throw error;
    }
}

Проблема кодировки и кириллицы в логинах

Разберем важный нюанс, который часто упускают: функция btoa() в JavaScript предназначена для работы со строками в кодировке Latin1. Если имя пользователя в 1С содержит русские буквы (например, "Администратор"), прямой вызов btoa() вызовет ошибку или создаст невалидный заголовок.

Рассмотрим, как правильно закодировать учетные данные с поддержкой UTF-8:


function encodeAuth(login, password) {
    const str = login + ':' + password;
    // Используем связку encodeURIComponent и unescape для корректного преобразования в Base64
    return btoa(unescape(encodeURIComponent(str)));
}

Настройка сервера 1С: файл default.vrd и CORS

Даже если ваш JS-код идеален, браузер заблокирует ответ, если сервер 1С явно не разрешит вашему сайту обращаться к нему. Выясним, как настроить публикацию 1С. Основным файлом конфигурации здесь является default.vrd, который находится в папке публикации на веб-сервере (IIS или Apache).

Начиная с версии платформы 8.3.17, в 1С появилась встроенная поддержка CORS прямо в файле описания публикации. Нам нужно добавить секцию <cors> внутри тега <point>. Посмотрим на пример настройки:


<point ...>
    <httpServices>
        <cors>
            <allowOrigins>https://mysite.com</allowOrigins>
            <allowMethods>POST, GET, OPTIONS</allowMethods>
            <allowHeaders>Content-Type, Authorization</allowHeaders>
            <allowCredentials>true</allowCredentials>
        </cors>
        <service name="MyService" rootUrl="hs_root" enable="true"/>
    </httpServices>
</point>

Важный момент: если вы используете allowCredentials="true", то в allowOrigins нельзя ставить звездочку *. Необходимо указывать конкретный адрес вашего сайта.

Обработка Preflight-запроса (метод OPTIONS)

Когда браузер видит запрос с заголовком Authorization, он сначала отправляет «предварительный» запрос методом OPTIONS (так называемый Preflight). Если ваш HTTP-сервис в 1С не знает, как на него отвечать, основной запрос даже не начнется.

Рассмотрим шаги по реализации обработки OPTIONS в 1С:

  1. В конфигураторе 1С откройте ваш HTTP-сервис.
  2. В шаблоне URL добавьте новый метод с именем OPTIONS.
  3. В обработчике этого метода напишите код, который возвращает пустой ответ со статусом 200 и нужными заголовками.

Пример кода в 1С для метода OPTIONS:


Функция ОбработатьOptions(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    // Эти заголовки должны дублировать настройки веб-сервера для надежности
    Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "https://mysite.com");
    Ответ.Заголовки.Вставить("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
    Ответ.Заголовки.Вставить("Access-Control-Allow-Headers", "Content-Type, Authorization");
    Возврат Ответ;
КонецФункции

Настройка авторизации на уровне веб-сервера (IIS/Apache)

Проанализируем ситуацию, когда ошибка 401 возникает еще до того, как запрос попадает в 1С. Это происходит, если веб-сервер настроен некорректно. Для работы программной авторизации из JavaScript необходимо выполнить следующие условия:

  1. Анонимный доступ: В настройках публикации на IIS или Apache должен быть разрешен анонимный доступ. Это может показаться странным, но это нужно для того, чтобы 1С сама могла прочитать заголовок Authorization и выполнить вход. Если включена только "Проверка подлинности Windows", браузер будет пытаться использовать системную учетную запись и выдаст ошибку.
  2. Базовая аутентификация: Убедитесь, что в файле web.config (для IIS) не запрещены методы Basic-авторизации.

Использование инструментов отладки

Если решение все еще не найдено, воспользуемся инструментами мониторинга трафика, такими как Fiddler или вкладка Network в инструментах разработчика браузера (F12). Разберем, на что обратить внимание:

Следуя этим шагам и правильно комбинируя настройки JS-запроса с параметрами файла default.vrd, вы сможете реализовать бесшовную и безопасную интеграцию вашего сайта с информационной базой 1С.

← На главную