powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SOAP сервер Помогите с авторизацией
9 сообщений из 9, страница 1 из 1
SOAP сервер Помогите с авторизацией
    #39666996
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые!

Цель следующая: нужно чтобы SOAP сервер имел аутентификацию. Желательно HTTP (Если я правильно понял, в этом случае она будет запрашивать логин и пароль в броузере, и иметь возможность получать логин и пароль через заголовок).
Немного сумбурно, но как могу =).

Имею следующее:
Модуль MyTestIntf.pas
Код: pascal
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.
unit MyTestIntf;

interface

uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns, Xml.XMLIntf;

const
  IS_TEXT = $0020;

type
   TSOAPCredentials = class(TSoapHeader)
   private
      FPassword: string;
      FUsername: string;
   public
     constructor Create; override;
     function ObjectToSOAP(RootNode, ParentNode: IXMLNode;
                              const ObjConverter: IObjConverter;
                              const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions;
                              out RefID: InvString): IXMLNode; override;
   published
     property userName     : string read FUsername write Fusername;
     property userPassword : string read FPassword write FPassword;
   end;

  { Invokable interfaces must derive from IInvokable }
  IMyTest = interface(IInvokable)
  ['{7CD79B70-E3CC-44EB-BA01-237551CCD2FC}']

    function someMethod(): String; stdcall;
  end;

implementation

uses
  Soap.SOAPPasInv;

{ TSOAPCredentials }

constructor TSOAPCredentials.Create;
begin
  inherited;
  MustUnderstand := True;
end;

function TSOAPCredentials.ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter;
  const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions;
  out RefID: InvString): IXMLNode;
begin
   Result := ParentNode.AddChild('userName');
   Result.Text := FUsername;
   Result := ParentNode.AddChild('userPassword');
   Result.Text := FPassword;
end;


initialization
  { Invokable interfaces must be registered }
  InvRegistry.RegisterInterface(TypeInfo(IMyTest));
  InvRegistry.RegisterHeaderClass(TypeInfo(IMyTest), TSOAPCredentials);
end.



Модуль MyTestImpl.pas
Код: pascal
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.
unit MyTestImpl;

interface

uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns, MyTestIntf;

type

  { TMyTest }
  TMyTest = class(TInvokableClass, IMyTest)
  public
    function someMethod(): String; stdcall;
  end;

implementation

function TMyTest.someMethod: String;
Var
  Headers: ISOAPHeaders;
  Auth: TSOAPCredentials;
begin
  Headers := Self as ISOAPHeaders;
  Auth := Headers.Get(TSOAPCredentials) as TSOAPCredentials;
  if Auth=nil then
    Result := 'Нет'
  else
    Result := 'Да';
end;

initialization
{ Invokable classes must be registered }
   InvRegistry.RegisterInvokableClass(TMyTest);
end.



Текущий проект пытается получить заголовок, и если он есть, то сообщить в результат функции "Да" в противном случае "Нет".
Не могу никак получить ни одного заголовка пробовал различными способами, всегда получается что заголовки не передаю.

Проверяю с помощью SOAPUI
Запрос следующий:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:MyTestIntf-IMyTest">
   <soapenv:Header>
      <TSOAPCredentials xsi:type="urn:TSOAPCredentials" xmlns:urn="urn:MyTestIntf">
         <userName xsi:type="xsd:string">Login</userName>
         <userPassword xsi:type="xsd:string">Password</userPassword>
      </TSOAPCredentials>
   </soapenv:Header>
   <soapenv:Body>
      <urn:someMethod soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
   </soapenv:Body>
</soapenv:Envelope>



Ответ получаю в следующем виде:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS1="urn:MyTestIntf-IMyTest">
      <NS1:someMethodResponse>
         <return xsi:type="xsd:string">Нет</return>
      </NS1:someMethodResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>



Помогите, может кто знает, что я делаю не так.
P.S. Да я знаю что получается не HTTP авторизация, как ее сделать не знаю, потому и спрашиваю. =)
...
Рейтинг: 0 / 0
SOAP сервер Помогите с авторизацией
    #39667006
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикладываю исходники
...
Рейтинг: 0 / 0
SOAP сервер Помогите с авторизацией
    #39667271
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HTTP авторизация делается средствами web-сервера а не средствами протокола SOAP.
Если вы через хидеры-soap добавляете авторизацию, то и требовать он будет ее также через хидеры-soap, а не хидеры-реквеста.

А т.к. в Delphi транспортный уровень стандартного soap захардкожен, то добавить http думаю будет проблематично.. или каким-то образом на событиях найти места где до обработки пакетов смотреть что пришло, вручную брать заголовки реквеста, парсить, если нет авторизации, подменять на свои хидеры респонса которые будут требовать авторизацию ну и обрабатывать самим эти хидеры.
...
Рейтинг: 0 / 0
SOAP сервер Помогите с авторизацией
    #39667308
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через THTTPRIO.HTTPWebNode.UserName и THTTPRIO.HTTPWebNode.Password.
...
Рейтинг: 0 / 0
SOAP сервер Помогите с авторизацией
    #39667318
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЧерез THTTPRIO.HTTPWebNode.UserName и THTTPRIO.HTTPWebNode.Password.
Это клиент, если подключится... А там сервер...
...
Рейтинг: 0 / 0
SOAP сервер Помогите с авторизацией
    #39667432
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SOAP сервер Помогите с авторизацией
    #39667466
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite,

Спасибо, пошел по указанному пути и в принципе получилось решить Basic Authorization.
Перехватываю запрос вот тут

Код: pascal
1.
2.
3.
4.
5.
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
end;



и ручками узнаю из объекта Request наличие авторизации, логина и пароля (декодируется из Base64MIME), потом его анализирую и решаю, что нужно сделать вернуть код ошибки авторизации
Код: pascal
1.
  Response.Realm := '401'



или далее выполнять обработку запроса

Код: pascal
1.
  WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);



Да, я понимаю, что есть свои минусы данного решения, я пока другого способа не нашел, если есть подскажите как.
...
Рейтинг: 0 / 0
SOAP сервер Помогите с авторизацией
    #39667467
FoxJr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat,

К сожалению, может вы не правильно прочитали суть проблемы, может я не нашел в справке нужного, НО: предлагаемый там вариант авторизации так называемая авторизация через SOAP заголовки, мне же нужна через HTTP заголовки.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
SOAP сервер Помогите с авторизацией
    #40055505
cheacher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Долго искал ответ на похожий вопрос.
Как проверить soap-клиента с basic auth на уровне http заголовка.
Смоделировал так:
Сделал простейший soap в виде приложения ISAPI для IIS.
На это приложение настроил basic auth.
Дальше с помощью SoapUI трассировал заголовки тело http-запросов.

Вероятно, можно было проще.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SOAP сервер Помогите с авторизацией
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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