Перейти к содержанию
Fire Monkey от А до Я
  • 0

WSDL ссылки 1С и Basic Authorization


Борислав Артеменко

Вопрос

Господа, приветствую вас.

Вопрос возник откуда не ждали.

Суть:

Есть база 1С(пустая конфа, создал специально для тестов) в которой написал web сервис с функцией генерации XML.

web сервис опубликовал, все замечательно.

В Delphi, через импорт wsdl - импортировал описание сервиса, все отлично отработало. На форму закинул memo и получил сгенерированную XML из 1С.

procedure TForm1.Button2Click(Sender: TObject);
var
  Fulltext: string;
  WS: TestWebServicePortType;
begin
   ws:=GetTestWebServicePortType(false, Edit3.Text);
   Memo1.Lines.Clear;
   Memo1.Lines.Add(ws.CreateXML('parametr1', 'parametr2'));
end;

Но, тут пришло время добавить пользователей в базу 1С. Добавил, все хорошо. Через браузер открывается ссылка на wsdl, запрашивает логин\пароль и после ввода данных - благополучно открывается.

В Delphi же теперь, при попытке получить данные - возникает ошибка "Unauthorized(401) -http://site/...1cws" что в принципе логично, потому как - никто данные для авторизации не передавал. И вот здесь начинается мой вопрос: как осуществить Basic Authorization для wsdl ?

Перепробовал уже все что только нашел на просторах интернета

Добавление 

RIO.HTTPWebNode.PreemptiveAuthentication:=true;
rio.HTTPWebNode.Password:='username';
RIO.HTTPWebNode.UserName:='pass';

в сгенерированный Unit web сервиса не работает, причем данные пробовал подсовывать как в открытом виде так и в base64, - эффекта не дало.

Нашел пример реализации на компоненте THTTPClient и он оказался рабочим, вот только мне это не помогло, подумалось - если приложение авторизуется через один компонент то другому уже не потребуется авторизация но, нет  :(

procedure TForm1.DoRequest(const url, username, password, filename: string);
var
  http: THTTPClient;
  ss: TStringStream;
  base64: TBase64Encoding;
begin
  http := THTTPClient.Create;
  ss := TStringStream.Create('', TEncoding.UTF8);
  base64 := TBase64Encoding.Create(0);
  try
    // option #1 - build in credential storage
    http.CredentialsStorage.AddCredential(
      TCredentialsStorage.TCredential.Create(
        TAuthTargetType.Server, '', url, username, password
    ));
    // option #2 - custom "Authorization"
    http.CustomHeaders['Authorization'] := 'Basic ' + base64.Encode(username + ':' + password);

   // http.ProxySettings.Create('127.0.0.1', 8888); // for fiddler
    http.Get(url, ss);
    Memo1.Lines.LoadFromStream(ss);
  //  ss.SaveToFile(filename);
  finally
    base64.Free;
    ss.Free;
    http.Free;
  end;
end;

Догадываюсь - что для счастья мне нужно как то задать CustomHeader для THTTPRIO в сгенерированном Unit-е web сервера по аналогии с THTTPClient.CustomHeaders['Authorization'] := 'Basic ' + base64.Encode(username + ':' + password); и посылать данные для авторизации перед каждым запросом в 1С. Так ли это? Как пройти эту авторизацию? Очень прошу вашей помощи. С уважением, разраб-любитель

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Сам спросил, сам ответил :)

    RIO.HTTPWebNode.UserName:='user';
    rio.HTTPWebNode.Password:='pass';

работает, просто нужно было выше поднять в описании web сервиса.

Получившийся код:

var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    RIO.HTTPWebNode.UserName:='user';
    rio.HTTPWebNode.Password:='pass';
    Result := (RIO as TestWebServicePortType);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...