База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как отправить HTTP-запрос с Digest авторизацией из 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 6 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
7 сентября 2026 в 20:30 #38602
Как отправлять http-запросы с digest авторизацией?
-
7 сентября 2026 в 20:30 #38603
Digest-аутентификация — более сложный протокол, чем Basic, и 1С штатно не умеет её автоматически обрабатывать. Чтобы отправить HTTP-запрос с Digest авторизацией из 1С, нужно реализовать весь процесс вручную:
1. Отправляете первый запрос без авторизации, получаете ответ с кодом 401 и заголовком WWW-Authenticate, в котором сервер присылает параметры (nonce, realm, qop и др.).
2. На основе этих параметров, логина, пароля и данных запроса формируете хэш (MD5) согласно RFC 2617.
3. Формируете заголовок Authorization с типом Digest и вычисленными параметрами.
4. Отправляете повторный запрос с этим заголовком.
В 1С это реализуется примерно так:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839Функция ПолучитьПараметрыDigest(ЗаголовокWWWAuthenticate)// Парсим строку WWW-Authenticate, выделяем параметры в СоответствиеПараметры = Новый Соответствие;// Пример парсинга: realm="example", nonce="abc123", qop="auth"// Реализуйте разбор строки вручную или регуляркамиВозврат Параметры;КонецФункцииФункция ВычислитьDigestАвторизацию(Параметры, Метод, URI, Логин, Пароль, ТелоЗапроса, НомерЗапроса)// Формируем HA1 = MD5(Логин:realm:Пароль)HA1 = Новый ХешированиеДанных(ХэшФункция.MD5).Вычислить(Логин + ":" + Параметры.Получить("realm") + ":" + Пароль);// Формируем HA2 = MD5(Метод:URI)HA2 = Новый ХешированиеДанных(ХэшФункция.MD5).Вычислить(Метод + ":" + URI);// Формируем response = MD5(HA1:nonce:nonceCount:cnonce:qop:HA2)// nonceCount — счётчик запросов, cnonce — случайная строкаnonceCount = Формат(НомерЗапроса, "X8");cnonce = СредстваВремени.ПолучитьТекущееВремя().Строка();response = Новый ХешированиеДанных(ХэшФункция.MD5).Вычислить(HA1 + ":" + Параметры.Получить("nonce") + ":" + nonceCount + ":" + cnonce + ":" + Параметры.Получить("qop") + ":" + HA2);// Формируем строку заголовка AuthorizationАвторизация = "Digest username=""" + Логин + """, realm=""" + Параметры.Получить("realm") + """, nonce=""" + Параметры.Получить("nonce") + """, uri=""" + URI + """, qop=" + Параметры.Получить("qop") + ", nc=" + nonceCount + ", cnonce=""" + cnonce + """, response=""" + response + """, opaque=""" + Параметры.Получить("opaque") + """";Возврат Авторизация;КонецФункцииПроцедура ОтправитьDigestЗапрос(Сервер, АдресРесурса, Логин, Пароль)Соединение = Новый HTTPСоединение(Сервер);Запрос = Новый HTTPЗапрос(АдресРесурса);Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);Если Ответ.КодСостояния = 401 ТогдаWWWAuthenticate = Ответ.Заголовки["WWW-Authenticate"];ПараметрыDigest = ПолучитьПараметрыDigest(WWWAuthenticate);Авторизация = ВычислитьDigestАвторизацию(ПараметрыDigest, "GET", АдресРесурса, Логин, Пароль, "", 1);Запрос.Заголовки.Вставить("Authorization", Авторизация);Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);КонецЕсли;Сообщить("Код ответа: " + Ответ.КодСостояния);Сообщить("Тело ответа: " + Ответ.ПолучитьТелоКакСтроку());КонецПроцедурыВажные моменты:
— Digest требует точного соблюдения формата и вычислений, включая nonceCount, cnonce, qop.
— Парсинг заголовка WWW-Authenticate нужно делать аккуратно, т.к. там могут быть кавычки, запятые.
— MD5-хеши в 1С считаются через Новый ХешированиеДанных(ХэшФункция.MD5).Вычислить(Строка).
— Если qop отсутствует, алгоритм чуть проще.
— Для сложных случаев лучше использовать готовые библиотеки или внешние компоненты.
Рекомендую посмотреть пример реализации Digest-аутентификации в 1С здесь:
https://infostart.ru/public/709325/ (там есть пример кода и разбор алгоритма)Если нужна простая интеграция с API, где используется Digest, иногда проще использовать внешние компоненты (например, WinHttpRequest через COM) или специализированные коннекторы, которые умеют Digest из коробки.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.