Имя: Пароль:
1C
1С v8
Проблема с подключением к http сервису на 1С из python
0 yurii-syrkin
 
22.04.20
17:50
Здравствуйте. Необходимо связать базу 1С и сайт на python. В 1С создал http сервис. Он работает, в браузере могу зайти по адресу, появляется информация в json формате, всё норм. Но вот из python ни как не могу подключиться к этому сервису, выдаётся ошибка 401. http сервис развернул на веб сервере IIS 10. Вот код:

from urllib import request
from requests.auth import HTTPBasicAuth
import requests

myUrl = 'http://localhost/Uchet_Chasov/hs/DataExchange'
res = requests.get(myUrl, headers= {'Authorization': ‘Basic’}, auth=HTTPBasicAuth('логин', ‘пароль’))

Какие бы логин с паролем я не передавал (и от ОС windows, и пользователь 1С) всё равно в res ошибка 401. Уже два дня бьюсь, ни чего не помогает. Если кто сталкивался, подскажите как быть. Спасибо.
1 quest
 
22.04.20
18:05
могу ошибится, но по моему у питонанадо явно указыать юникод в строках
auth=HTTPBasicAuth(u'логин', u‘пароль’)
но могу ошибаться
2 такт
 
22.04.20
18:14
а если авторизацию в vrd - подключается ?
3 yurii-syrkin
 
22.04.20
18:15
(1) Нет, не помогло
4 yurii-syrkin
 
22.04.20
18:16
(2) А это как? Не совсем понял. Я честно говоря так и не понял, чьи учетные данные необходимо указывать пользователя 1С или виндовые?
5 такт
 
22.04.20
18:20
(4) в файле vrd в строке сервера и базы добавляешь ;;Usr=хххх;Password=хххх;
6 такт
 
22.04.20
18:24
+5 Password на Pwd
7 yurii-syrkin
 
22.04.20
18:26
Вот так да? ib="Srvr="Tyson";Ref="Uchet_Chasov";Usr=sa;Password=12345;"
8 yurii-syrkin
 
22.04.20
18:27
Всё равно не получается. 401 хоть убейся
9 такт
 
22.04.20
18:27
10 такт
 
22.04.20
18:39
(9) если не поможет можно посмотреть CORS policy
11 yurii-syrkin
 
22.04.20
18:47
Вот я как раз вникаю и пробую. А CORS policy что такое?
12 bolero
 
22.04.20
18:48
(0) > headers= {'Authorization': ‘Basic’}
а кто тебе сказал так делать, дополнительно еще заголовок кидать? возможно, IIS ругается на то, что ты два раза его шлешь

у меня так УМВР:

s = requests.Session()
s.auth = (conf.odata_username, conf.odata_password)
ret = s.get(url)


(10) (11) не, CORS тут не виноват
13 yurii-syrkin
 
22.04.20
18:55
(12) Да я и с заголовками пробовал и без и с картежем и через auth=HTTPBasicAuth(. Сейчас попробовал как вы посоветовали через s = requests.Session(), всё равно не помогает
14 Serginio1
 
22.04.20
19:17
У тебя логин или пaроль на кириллице? там надо приводить к Utf8
https://ru.stackoverflow.com/questions/554879/Авторизация-soap-клиента-на-c-по-протоколу-https/555305#555305
15 Garykom
 
гуру
22.04.20
20:22
myUrl = 'http://localhost/Uchet_Chasov/hs/DataExchange'
res = requests.get(myUrl, auth=('username', 'password')
16 yurii-syrkin
 
22.04.20
20:54
(14) Нет, на английском языке всё и логин и пароль
17 Вафель
 
22.04.20
20:56
Cors это вообще только для браузера инструкция
18 yurii-syrkin
 
22.04.20
21:01
В заголовке ответа вот такая хрень приходит {'Cache-Control': 'private', 'Content-Type': 'text/html; charset=utf-8', 'Server': 'Microsoft-IIS/10.0', 'WWW-Authenticate': 'Basic realm="1C:Enterprise 8.3", Negotiate, NTLM, Basic realm="localhost"', 'Date': 'Wed, 22 Apr 2020 17:58:35 GMT', 'Content-Length': '6294'}
19 yurii-syrkin
 
22.04.20
21:01
То есть получается python всё таки достукивается до сервиса?
20 yurii-syrkin
 
22.04.20
21:06
Вот такой вот ответ невнятный:
strict_ns_set_initial_dollar:False
strict_ns_set_path:False
strict_ns_unverifiable:False
strict_rfc2965_unverifiable:True
_allowed_domains:None
_blocked_domains:()
_now:1587578615
status_code:401
text:'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">; \n<html xmlns="http://www.w3.org/1999/xhtml">; \n<head> \n<title>Подробные данные об ошибке IIS 10.0 — 401.5 — Unauthorized</title> \n<style type="text/css"> \n<!-- \nbody{margin:0;font-size:.7em;font-family:Verdana,Arial,Helvetica,sans-serif;} \ncode{margin:0;color:#006600;font-size:1.1em;font-weight:bold;} \n.config_source code{font-size:.8em;color:#000000;} \npre{margin:0;font-size:1.4em;word-wrap:break-word;} \nul,ol{margin:10px 0 10px 5px;} \nul.first,ol.first{margin-top:5px;} \nfieldset{padding:0 15px 10px 15px;word-break:break-all;} \n.summary-container fieldset{padding-bottom:5px;margin-top:4px;} \nlegend.no-expand-all{padding:2px 15px 4px 10px;margin:0 0 0 -12px;} \nlegend{color:#333333;;margin:4px 0 8px -12px;_margin-top:0px; \nfont-weight:bold;font-size:1em;} \na:link,a:visited{color:#007EFF;font-weight:bold;} \na:hover{text-decoration:none;} \nh1{font-size:2.4em;margin:0;color:#FFF;} \nh2{...
url:'http://localhost/Uchet_Chasov/hs/DataExchange'
_content:b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">; \n<html xmlns="http://www.w3.org/1999/xhtml">; \n<head> \n<title>\xd0\x9f\xd0\xbe\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb1\xd0\xbd\xd1\x8b\xd0\xb5 \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb5 \xd0\xbe\xd0\xb1 \xd0\xbe\xd1\x88\xd0\xb8\xd0\xb1\xd0\xba\xd0\xb5 IIS 10.0 \xe2\x80\x94 401.5 \xe2\x80\x94 Unauthorized</title> \n<style type="text/css"> \n<!-- \nbody{margin:0;font-size:.7em;font-family:Verdana,Arial,Helvetica,sans-serif;} \ncode{margin:0;color:#006600;font-size:1.1em;font-weight:bold;} \n.config_source code{font-size:.8em;color:#000000;} \npre{margin:0;font-size:1.4em;word-wrap:break-word;} \nul,ol{margin:10px 0 10px 5px;} \nul.first,ol.first{margin-top:5px;} \nfieldset{padding:0 15px 10px 15px;word-break:break-all;} \n.summary-container fieldset{padding-bottom:5px;margin-top:4px;} \nlegend.no-expand-all{padding:2px 15px 4px 10px;margin:0 0 0 -12px;} \nlegend{color:#333333;;margin:4px 0 8px -12px;_...
_content_consumed:True
_next:None
21 yurii-syrkin
 
22.04.20
21:20
В IIS на уровне сайта в разделе проверка пользователя включена только Анонимная проверка пользователя и Обычная проверка пользователя. Может там ещё что то надо включить?
22 Сияющий в темноте
 
23.04.20
00:20
а почему бы не собрать авторизацию вручную через перевод строки в utf8,а потом в base64 у меня в javascript так рмботало прекрасно.
и еще,если у сервиса включен режим повторного использования (то есть use или auto),то он хочет команду начала сессии увидеть в заголовке или команду продолжения-если ее нет,то и будет 401
23 yurii-syrkin
 
24.04.20
18:34
Попробовал вот так:
respons = requests.get(myUrl, auth =('login'.encode('utf-8'), 'password'.encode('utf-8')))
status_code = respons.status_code
print(status_code)

При этом и так уже логин с паролем на английском языке. Всё равно ошибка 401. Вот что странно, когда я указываю логин и пароль админа Windows я получаю ошибку 401.5, а когда я указываю логин и пароль пользователя 1С, получаю ошибку 401.1. Само собой в файле default.vrd тоже пробовал указывать и те и те учетные данные.
24 yurii-syrkin
 
24.04.20
18:47
Вот кусок лога IIS 10

#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2020-04-23 20:49:44 ::1 GET /Uchet_Chasov/hs/DataExchange - 80 Tyson\sa ::1 python-requests/2.23.0 - 401 5 0 8
2020-04-23 20:49:44 ::1 GET /Uchet_Chasov/hs/DataExchange - 80 Tyson/sa ::1 python-requests/2.23.0 - 401 5 0 8
2020-04-23 20:49:44 ::1 GET /Uchet_Chasov/hs/DataExchange - 80 Yurii ::1 python-requests/2.23.0 - 401 1 1326 2
25 Cyberhawk
 
24.04.20
20:17
IIS поднастрой
26 yurii-syrkin
 
24.04.20
21:11
(25) Да я уже понял, всё к этому ведёт. Вот сижу читаю документацию на Microsoft. Не подскажешь на что более пристальное внимание обратить?
27 acht
 
24.04.20
22:25
(26) Оставь на иисе только анонимную авторизацию, чтобы он пробрасывал авторизацию в 1С. После этого или прибей гвоздями пользователя в vrd, или передавай басик авторизацию пользователя 1С. В какой кодировке - не помню, оставь логин/пароль латиницей.
28 Сияющий в темноте
 
24.04.20
22:44
попробуйте написать запрос в javascript через xmlhttprequest, и только когда он заработает,переходите на питон.
авторизация собирается через base64 и вставляется как поле заголовка.
29 yurii-syrkin
 
24.04.20
22:58
В общем, расковырял IIS, оставил только обычную аутентификацию, то бишь Basic и теперь вместо 401 ошибки выходит 404.0. Уф, день прошёл не зря)
30 Сияющий в темноте
 
24.04.20
23:00
setRequestHeader('Authorization','Basic '+StringToBase64(User+':'+Password))
setRequestHeader('IBSession','start')
31 Сияющий в темноте
 
24.04.20
23:01
этотв заголовки запроса,и должно взлететь.
32 yurii-syrkin
 
24.04.20
23:24
Да тут уже или в публикации дело или в сайте, потому что сейчас даже через браузер не могу увидеть свой json. А раньше мог
33 Serginio1
 
24.04.20
23:42
Самое простое это сделать запрос из 1С и посмотреть через фиддлер что уходит  или  используя postman https://software-testing.ru/library/testing/testing-tools/2638-postman
Если ты не можешь подклюючиться используя в vrd Usr=sa;Password=12345;" то явно проблема не с авторизацией
34 Fragster
 
гуру
24.04.20
23:59
простейший способ - сделать юзера с именем и паролем английскими буквами
35 Fragster
 
гуру
25.04.20
00:03
а вообще - на js для русскоязычных  логинов и паролей прокатывает так:
    let res = await axios.get(uri, {
      auth: {
        username: unescape(encodeURIComponent(username)),
        password: unescape(encodeURIComponent(password))
      }
, при том, что для англоязычных можно прям как есть посылать.
36 novichok79
 
25.04.20
01:15
попробовать через postman или попробовать поднять apache и проверить там.
37 yurii-syrkin
 
25.04.20
17:16
Переустановил IIS, переопубликовал сервис. Теперь снова ошибка 401.5 (По URL-адресу, куда надо попасть, установлено приложение ISAPI или CGI, выполняющее проверку учетных данных пользователя до начала обработки данных. Данное приложение не может проверить ваши учетные данные). Поставил postman, попробовал там сделать это запрос, ответ тот же. Честно говоря не очень вообще врубился зачем этот CGI вообще мне нужен. Я его даже не выбрал в установке. А в разделе Ограничения ISAPI и CGI у IIS вообще всё удалил. К вопросу о том на кирилице ли у меня пароль с логином. Нет, всё на латинице и пароль и логин и в 1С и в Windows.
38 Cyberhawk
 
25.04.20
18:39
(26) Для начала - отключить в пуле управляемый код
39 yurii-syrkin
 
25.04.20
22:47
Всем огромное спасибо, братва! Очередной раз переустановил IIS без всяких способов аутентификации. Настроил обработчики, MIME типы, анонимную проверку подлинности. В итоге в браузер захожу на http сервис, запрашивает авторизацию 1С-овской учётки, показывает json. И в python тоже возвращает 200-й код всеми способами и через (requests.get(myUrl, auth =('Login', 'Password'))) и через (requests.get(myUrl, headers= {'Authorization': 'Basic'}, auth =('Login', 'Password'))) и так (requests.get(myUrl, auth =('Login'.encode('utf-8'), 'Password'.encode('utf-8')))). Аллилуйя, не прошло и недели)
40 Aleksk75
 
21.05.20
15:43
Юрий, а логин-пароль пользователя 1С или Win указывали?
AdBlock убивает бесплатный контент. 1Сергей