Как сделать http запрос, когда есть пароль на веб-сервере и 1С?

1. Dream_kz 129 24.11.23 14:55 Сейчас в теме
Есть база, опубликованная через 1С:линк, настроена дополнительная авторизация на веб-сервере.
Нужно как-то выполнить http-запрос к этой базе, но не понятно куда указывать пароль 1С и веб-сервера

Пробовал так
Http = Новый HTTPСоединение("example.link.1c.ru", 443,"Логин1С","Пароль1С",,20,Новый ЗащищенноеСоединениеOpenSSL,);
       
   Заголовки = Новый Соответствие;
   Заголовки.Вставить("Authorization", "Basic " + ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("ПользовательВебСервера:ПарольВебСервера")); //здесь логин/пароль от веб-сервера

   Запрос = Новый HTTPЗапрос("/buh/hs/billing/version/", Заголовки);
   
   Ответ =    Http.Получить(Запрос, "");
   
   ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Показать


Код возвращает 401
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user856012 13 24.11.23 18:16 Сейчас в теме
(1) Может, у вас Base64 получается больше, чем в одну строку, как с этим мучились вот тут?

Не зря же здесь специально избавляются от них:

	СтрокаBase64 = ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("" + ИмяПользователя + ":" + Пароль, КодировкаТекста.UTF8, Ложь));
	СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
	СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
4. Dream_kz 129 25.11.23 18:46 Сейчас в теме
(2) Это я видел, так не работает
6. user856012 13 25.11.23 23:50 Сейчас в теме
(4)
Это я видел
Но в коде не использовали.
так не работает
Ну, а ничего другого вам пока что никто не предложил.

Я бы все-таки проверил - а корректно ли у вас формируется строка авторизации? То есть, вставил бы в код:
Сообщить(ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("ПользовательВебСервера:ПарольВебСервера")));

Или вычислил бы это выражение в Отладчике.

А потом сравнил бы значение с результатом какого-нибудь онлайн-декодера, например: https://www.base64encode.org/

По крайней мере, для строки "ПользовательВебСервера:ПарольВебСервера" результат отличается как раз на Символы.ВК+Символы.ПС (выглядит как ¶).
7. Dream_kz 129 26.11.23 11:35 Сейчас в теме
(6) Проверял, не работает
5. krasnodar-it 25.11.23 19:56 Сейчас в теме
АдресСервера = "www.server.com";
Ресурс = "/api/endpoint";
ИмяПользователя = "user";
Пароль = "password";

СтрокаАвторизации = ПолучитьBase64СтрокуИзДвоичныхДанных(
ПолучитьДвоичныеДанныеИзСтроки(
""+ИмяПользователя+":"+Пароль,КодировкаТекста.UTF8,Ложь));

SSL = Новый ЗащищенноеСоединениеOpenSSL;

Соединение = Новый HTTPСоединение(АдресСервера,443,,,,,SSL);

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8"); 
Заголовки.Вставить("Authorization", "Basic "+СтрокаАвторизации); 

Запрос = Новый HTTPЗапрос(Ресурс,Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрокаJSON);

ИмяФайлаОтвета = ПолучитьИмяВременногоФайла();

Ответ = Соединение.ОтправитьДляОбработки(Запрос,ИмяФайлаОтвета);
Показать
8. Dream_kz 129 26.11.23 11:36 Сейчас в теме
(5) Дак это и сейчас есть, куда воткнуть логин/пароль от 1С? А куда воткнуть логин/пароль от веб-сервера?
9. user856012 13 26.11.23 12:00 Сейчас в теме
(8)
куда воткнуть логин/пароль от 1С?
В первую строчку вашего кода.

У вас там что? Строки "Логин1С" и "Пароль1С" или реальные логин и пароль?
А куда воткнуть логин/пароль от веб-сервера?
Аналогично, вместо "ПользовательВебСервера:ПарольВебСервера"
10. Dream_kz 129 26.11.23 12:39 Сейчас в теме
(9) ну так я и пробовал, не работает
11. user856012 13 26.11.23 12:48 Сейчас в теме
(10) Ну так ждите, пока кто-нибудь угадает - что там вы накосячили при публикации вашей базы.
12. Dream_kz 129 26.11.23 15:18 Сейчас в теме
(11) Вы если не разбираетесь, зачем тут пишете?
13. user1880116 26.11.23 15:42 Сейчас в теме
(12)
Вы если не разбираетесь, зачем тут
А дай, пожалуйста, полный список того, что тут нельзя делать по твоей воле.
14. krasnodar-it 26.11.23 18:45 Сейчас в теме
(8)
// Логин пароль web
ИмяПользователя = "user";
Пароль = "password";

// Логин пароль 1с
Соединение = Новый HTTPСоединение(АдресСервера,443,Пользователь,Пароль,,,SSL);
15. Dream_kz 129 26.11.23 19:30 Сейчас в теме
(14) Вы мой код смотрели вообще? Я тоже самое использовал
16. lostcay 5 27.11.23 15:44 Сейчас в теме
Странно почему никто про это не сказал, но заголовок "Authorization" как раз тут тебе не нужен. Ты же указываешь их при создании HTTP соединения. То есть эта строчка просто не нужна.
Еще может у пользователя, которого ты указываешь для авторизации, нет прав на внешнее соединение, но это не точно.

Судя по переписке вы тут ищите какой-то логин веб-сервера, такого понятия нет, на сколько мне известно. Во всяком случае если 1с смогла вернуть 401, тогда с самим веб сервером все ок.

Очень рекомендую использовать postman, невероятно удобная утилита, с ним можешь сначала проверить что у принимающей стороны все хорошо, а уже потом работать со стороны 1с-ки + отлаживаться в 100 раз проще
starik-2005; +1 Ответить
17. Dream_kz 129 27.11.23 18:12 Сейчас в теме
(16) Я понимаю что есть Basic Authorization, и когда есть один пароль 1С, либо от веб-сервера достаточно туда передать его, и все будет работать, но когда пароля два, не понятно как их передавать.
Если подключаться тонким клиентом к такой базе, то в параметрах запуска можно указать параметры /wsn /wsp и передать пароль от веб-сервера, мне казалось, что при подключении к http сервису, тоже можно передать какой-то заголовок
18. lostcay 5 27.11.23 19:54 Сейчас в теме
Опять же не пароль от веб сервера, а пароль пользователя 1с под которым заходишь внешним соединением.
Если у тебя прописаны логин/пароль пользователя под которым выполняется внешнее соединение, то ни заголовки, ни параметры http соединения не нужны.

Или объясни что такое "пароль от веб сервера"
21. Dream_kz 129 28.11.23 18:26 Сейчас в теме
(18)
Или объясни что такое "пароль от веб сервера"

Ну если вкратце, то на апач можно установить пароль:
https://zalinux.ru/?p=4723
У меня nginx, но логика такая же


(18)
пароль пользователя 1с под которым заходишь внешним соединением

У пользователя полные права
19. user779438 28.11.23 13:05 Сейчас в теме
Вы уверены, что на веб-сервере для аутентификации логин и пароль указаны кириллицей? У Вас в примере кода указаны строковые константы "Логин1С" и "Пароль1С" это не ошибка? Попробуйте через браузер выполнить свой запрос, что происходит? Браузер, при получении ошибки 401, должен вывести стандартный (системный) запрос логин/пароль.
Пользователь и пароль, если верить СП, обязательно должны быть указаны латиницей:
Пользователь, от имени которого установлено соединение.
Не поддерживаются имена, содержащие символы алфавита, отличного от латинского.
20. Dream_kz 129 28.11.23 18:21 Сейчас в теме
(19)
Вы уверены, что на веб-сервере для аутентификации логин и пароль указаны кириллицей?

Да, пример на русском для понимания где какой пароль, реальные пароли латиницей

(19)
Попробуйте через браузер выполнить свой запрос, что происходит?

Данный запрос через браузер просто постоянно спрашивает логин/пароль, и пароль ни от 1С ни от веб-сервера не подходят.
Если подключаться через веб-клиент, сначала спросит логин от веб-сервера, а затем пароль от 1С.
22. spacecraft 28.11.23 18:34 Сейчас в теме
(20)
Данный запрос через браузер просто постоянно спрашивает логин/пароль, и пароль ни от 1С ни от веб-сервера не подходят.

Попробуйте логин/пароль от пользователя компьютера.
23. Dream_kz 129 28.11.23 18:41 Сейчас в теме
(22) Не подходит

Если указать неправильный пароль в заголовке Authorization, то nginx отвечает:
<ht ml>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx</center>
</body>
</html>
Показать


Если указать там пароль от веб-сервера, то 401 уже присылает 1С, в заголовке "WWW-Authenticate" возвращается "Basic realm="1C:Enterprise 8.3""
24. lostcay 5 29.11.23 00:26 Сейчас в теме
(21) Не знал что это такое. Ну хорошо, тогда есть предложение. В *.vrd файле публикации есть строчка "ib=...", тут мы можем установить, что при подключении всегда заходить под одним конкретным пользователем. Пример:
ib="Srvr="192.168.1.3";Ref="pra_unf";usr="ServiceWebUser";pwd="12345678""

Где "ServiceWebUser" - логин, а "12345678" - пароль. Остальная часть строки будет сгенерирована автоматически (по идее).

Сам файл можно найти в конфиге апача (httpd.conf), в альясе публикации:
# 1c publication
Alias "/pra_unf" "C:/Apache24/1c/"
<Directory "C:/Apache24/1c/">
    AllowOverride All
    Options None
    Require all granted
    SetHandler 1c-application
    ManagedApplicationDescriptor "C:/Apache24/1c/default.vrd"      <----- тут
</Directory>
Показать

Тогда достаточно при подключении пройти только авторизацию апача, а 1с дальше пустит под указанным логином.
25. Dream_kz 129 29.11.23 08:36 Сейчас в теме
(24) Не подходит такое решение, это 1С:Линк, с тем же успехом можно просто убрать пароль на веб-сервере
Меня интересует решение через указание пароля
26. user856012 13 29.11.23 09:38 Сейчас в теме
(25)
Меня интересует решение через указание пароля
...если оно вообще существует: HTTPСоединение и запуск 1С с ключами командной строки - немножко разные вещи.

Впрочем, зачем я это написал? Я же "не разбираюсь", как решил автор - пусть дальше выносит мозг другим! ;-P
27. user1880116 29.11.23 10:25 Сейчас в теме
Что там как, автор смог решить свою проблему?
30. Dream_kz 129 29.11.23 11:34 Сейчас в теме
28. lostcay 5 29.11.23 10:38 Сейчас в теме
(25) Если нужно с двумя паролями, боюсь решения нет и быть не может. А как это вообще можно себе представить? Вот заголовки запроса, типа обычная структура и на два одинаковых ключа "Authorization" - два разных значения. Ну бред же.

Вообще думаю тут нужно копать глубже. Действительно, почему бы просто не убрать пароль на веб-сервере?
То есть какой в себе несет смысл двойная авторизация? Если вопрос безопасности, ну сделать пароль в 2 раза длиннее, или в 5, чтобы было спокойнее, а в противном случае зачем?
29. Dream_kz 129 29.11.23 11:33 Сейчас в теме
(28)
Если вопрос безопасности, ну сделать пароль в 2 раза длиннее

В базе работают и обычные пользователи, и они не будут вводить сложные пароли. Пароль от веб-сервера в данном случае для них указан по умолчанию, понятно что можно и указать пароль от 1С в ярлыке, но так тоже делать нельзя, за одним рабочим местом может работать несколько кассиров, делать для каждого кассира свой профиль в системе или разные ярлыки слишком муторно
33. JM_1C 21.12.23 09:59 Сейчас в теме
(29) 1С:Линк, братан, вообще муторная тема... как варик юзай обычный веб-сервер без линка или обмен через облако. Поправь меня, если я не прав и не пинай здорово.)
31. Oracll 18.12.23 05:12 Сейчас в теме
логин и пароль помещаются в заголовок запроса
32. user1880116 18.12.23 16:32 Сейчас в теме
(31) Волга впадает в Каспийское море
romulanin; XAKEP; +2 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот