powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / windows авторизация для вызова веб-сервиса
6 сообщений из 6, страница 1 из 1
windows авторизация для вызова веб-сервиса
    #39660198
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо из линухового оракла вызвать веб-сервис, а там стоит windows-авторизация
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    v_req := utl_http.begin_request(v_service_URL, 'POST','HTTP/1.1');
              
    UTL_HTTP.set_authentication(v_req, 'domain\username', 'mypwd', 'Basic', FALSE); -- true for proxy 
    utl_http.set_header(v_req, 'Content-Type', 'text/xml;  charset=utf-8');
    utl_http.set_header(v_req, 'Content-Length', LENGTH(v_xmlRequest));
    utl_http.set_header(v_req, 'SOAPAction', '/api/values');
    utl_http.write_text(v_req, v_xmlRequest);
    dbms_output.put_line('start get_response', TRUE);
    v_resp := utl_http.get_response(v_req);
    V_status_code := v_resp.status_code;
    dbms_output.put_line('HTTP response: ' || v_resp.status_code || ' (' || v_resp.reason_phrase || ')', TRUE);


выдает
401 (Unauthorized)

чё делать, куда рыть
...
Рейтинг: 0 / 0
windows авторизация для вызова веб-сервиса
    #39660205
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12 лет назад написали, что нельзя
2770620
...
Рейтинг: 0 / 0
windows авторизация для вызова веб-сервиса
    #39660229
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Была проблема, что нужна была Windows авторизация на офисную проксю, решал с помощью Chtlm.
Можно ли через Chtlm авторизоваться на конечном сервере/веб-службе, не знаю.

надеюсь http://cntlm.sourceforge.net/ но сейчас весь сайт на мейтенансе, т.ч. адрес мне не проверить.
...
Рейтинг: 0 / 0
windows авторизация для вызова веб-сервиса
    #39660243
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотря что тебе от службы нужно
посмотри вот это:
NTLM for PL/SQL
...
Рейтинг: 0 / 0
windows авторизация для вызова веб-сервиса
    #39660266
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim LejninСмотря что тебе от службы нужно
посмотри вот это:
NTLM for PL/SQL передать туда файл
и получить оттуда файл
...
Рейтинг: 0 / 0
windows авторизация для вызова веб-сервиса
    #39813066
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для всех тех, кто столкнулся с той же задачей что и ТС - может кому-то сэкономит время. По ссылке можно найти пакеты для авторизации NTLM и работы по http (сейчас они входят в состав alexandria-plsql-utils , там есть обертка для работы по методу GET, но для SOAP требуется POST, с которым есть нюансы. Привожу код, с которым у меня все заработало.
простыня кода
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
declare
  cURL constant varchar2(160):='http://iis-test.local/FinReportWebService/FinReport.asmx';
  cSoapText constant varchar2(2000) :=
  '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:asmx="http://asmx.service.local/">
   <soapenv:Header/>
   <soapenv:Body>
      <asmx:GetReport>
        <asmx:arg>
            <asmx:ReportID>1</asmx:ReportID>
         </asmx:arg>
      </asmx:GetReport>
   </soapenv:Body>
</soapenv:Envelope>';
  cAction constant varchar2(100) := '"http://asmx.service.local/GetReport"';
  vSoapResp clob;
  vRespBuf varchar2(32767);

  http_req  utl_http.req;
  http_resp utl_http.resp;

  l_authenticate_with_ntlm       boolean;

  l_name                         varchar2(500);
  l_value                        varchar2(500);

  l_ntlm_message                 varchar2(500);

  l_negotiate_message            varchar2(500);

  l_server_challenge             raw(4000);
  l_negotiate_flags              raw(4000);

  l_authenticate_message         varchar2(500);

  l_username  varchar2(500) := 'DOMAIN\user'; --имя домена в uppercase
  l_password  varchar2(500) := 'Password';

  procedure debug_response (p_resp in out utl_http.resp)
  as
    l_name  varchar2(255);
    l_value varchar2(2000);
    l_body  clob;
  begin

    debug_pkg.printf('Response Status Code: %1', p_resp.status_code);

    for i in 1 .. utl_http.get_header_count (p_resp) loop
      utl_http.get_header (p_resp, i, l_name, l_value);
      debug_pkg.printf('#%1 %2 : %3', i, l_name, l_value);
    end loop;

    --debug_pkg.printf('Body length = %1', dbms_lob.getlength (l_returnvalue));
    debug_pkg.printf('Persistent connection count: %1', utl_http.get_persistent_conn_count);

  end debug_response;

begin
  debug_pkg.debug_on;

  utl_http.set_detailed_excp_support (enable => true);
  utl_http.set_response_error_check  (enable => false);

  utl_http.set_persistent_conn_support (true, 10);

  debug_pkg.printf(' ');
  debug_pkg.printf(curl);

  http_req:= utl_http.begin_request(cURL, 'HEAD','HTTP/1.1');
  utl_http.set_body_charset(http_req, 'UTF-8');

  utl_http.set_header(http_req, 'Content-Type', 'text/xml');
  utl_http.set_header(http_req, 'SOAPAction', cAction);
  utl_http.set_header(http_req, 'Content-Length', length(cSoapText));
  utl_http.set_header(http_req, 'Connection', 'Keep-Alive');
  utl_http.write_text(http_req, cSoapText);
  http_resp := utl_http.get_response(http_req);

  if http_resp.status_code = utl_http.HTTP_UNAUTHORIZED then
    utl_http.end_response (http_resp);

    l_negotiate_message := 'NTLM ' || ntlm_util_pkg.get_negotiate_message(l_username);
    -- need to send negotiation message

    debug_pkg.printf('Negotiate message: %1', l_negotiate_message);

    debug_pkg.printf(' ');
    debug_pkg.printf(curl);
    http_req:= utl_http.begin_request(cURL, 'HEAD','HTTP/1.1');
    utl_http.set_body_charset(http_req, 'UTF-8');
    utl_http.set_header(http_req, 'Content-Type', 'text/xml');
    utl_http.set_header(http_req, 'SOAPAction', cAction);
    utl_http.set_header(http_req, 'Content-Length', length(cSoapText));
    utl_http.set_header(http_req, 'Connection', 'Keep-Alive');
    utl_http.set_header(http_req, 'Authorization', l_negotiate_message);
    utl_http.write_text(http_req, cSoapText);
    http_resp := utl_http.get_response(http_req);
    if http_resp.status_code = utl_http.HTTP_UNAUTHORIZED then
      -- received server challenge
      utl_http.get_header_by_name(http_resp, 'WWW-Authenticate', l_value, 1);
      utl_http.end_response(http_resp);

      if substr(l_value, 1, 4) = 'NTLM' then
        l_value := substr(l_value, 6);
        ntlm_util_pkg.parse_challenge_message (l_value, l_server_challenge, l_negotiate_flags);

        l_authenticate_message := 'NTLM ' || ntlm_util_pkg.get_authenticate_message(l_username, l_password, l_server_challenge, l_negotiate_flags);
        debug_pkg.printf('Authenticate message: "%1"', l_authenticate_message);

        http_req:= utl_http.begin_request(cURL, 'POST','HTTP/1.1');
        utl_http.set_body_charset(http_req, 'UTF-8');
        utl_http.set_header(http_req, 'Content-Type', 'text/xml;charset=UTF-8');
        utl_http.set_header(http_req, 'SOAPAction', cAction);
        utl_http.set_header(http_req, 'Content-Length', length(cSoapText));
        utl_http.set_header(http_req, 'Connection', 'Close');
        utl_http.set_header(http_req, 'Authorization', l_authenticate_message);
        utl_http.write_text(http_req, cSoapText);
        http_resp := utl_http.get_response(http_req);
      end if;
    end if;
  end if;

  begin
    loop
       utl_http.read_text(http_resp,vRespBuf,32767);
       vSoapResp:=vSoapResp||vRespBuf;
    end loop;
  exception
    when utl_http.end_of_body then
      utl_http.end_response (http_resp);
  end;

  for i in 1..trunc(dbms_lob.getlength(vSoapResp)/256) loop
    dbms_output.put_line(dbms_lob.substr(vSoapResp, 256, 256*(i-1)+1));
  end loop;
  dbms_output.put_line(dbms_lob.substr(vSoapResp, 256, trunc(dbms_lob.getlength(vSoapResp)/256)*256+1));
end;



Нюанс в том, что NTLM требует неразрывного соединения (persistent), а POST из Oracle так не умеет. Workaround - использовать в запросах на NTLM challenge метод HEAD.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / windows авторизация для вызова веб-сервиса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]