Delphi Indy IdHTTP-авторизация

Я пытаюсь получить фотографии пользователей в Exchange, используя IdHTTP до REST API

Как получить фотографии пользователей с помощью EWS в Обмен

procedure TsMain.IdHTTP1Authorization(Sender: TObject;
  Authentication: TIdAuthentication; var Handled: Boolean);
begin
  Authentication.Username := DomainName +'\'+ User;
  Authentication.Username := User + #64 + DomainName;
  Authentication.Password := Password;
  Handled:=true;
end;

function TsMain.GetUserPhoto(const eMail: string):Boolean;
var
  s: TStream;
  ResponseCode: Integer;
begin
  Result := False;
  idHTTP:= TIdHttp.Create(Application);
  s := TFileStream.Create('mypic.jpg', fmCreate);
  try
    idHTTP.OnAuthorization := IdHTTP1Authorization;
    idHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idHTTP);
    idHTTP.HandleRedirects := True;
    idHTTP.Request.BasicAuthentication:= true;
    idHTTP.Get('https://ServerName/ews/Exchange.asmx/s/GetUserPhoto?email='+eMail+'&size=HR240x240', s);
    ResponseCode := idHTTP.Response.ResponseCode;
    case ResponseCode of
      200:
        begin
          Result := True;
        end;
    else
       ShowMessage(idHTTP.Response.ResponseText);
    end;
  finally
    s.Free;
    idHTTP.Free;
  end;
end;

Я получаю HTTP/1.1 401 Anonymous Request Disallowed.

Почему idHTTP не отправляет аутентификацию с запросом? Что я делаю неправильно?


person RepeatUntil    schedule 19.05.2016    source источник
comment
Вы должны указать исходные учетные данные пользователя в свойствах TIdHTTP.Request.Username и TIdHTTP.Request.Password до вызова TIdHTTP.Get(), если они у вас уже есть. Если сервер отклоняет учетные данные, запускается событие TIdHTTP.OnAuthorization, чтобы вы могли предоставить новые учетные данные (например, запросив пользователя), а затем соответствующим образом установить Handled (true = повторить попытку, false = остановить).   -  person Remy Lebeau    schedule 19.05.2016
comment
Также посмотрите на событие TIdHTTP.OnSelectAuthorization, которое сообщает вам, какие схемы аутентификации на самом деле разрешены сервером. Он может даже не разрешать аутентификацию BASIC для начала, и в этом случае TIdHTTP.Request.BasicAuthentication бесполезен, вам придется добавить соответствующие единицы IdAuthentication... в предложение uses (IdAuthenticationNTLM и т. д.), чтобы TIdHTTP.Request.Authentication можно было заполнить правильным типом класса (если вы не не назначайте его вручную).   -  person Remy Lebeau    schedule 19.05.2016
comment
@RemyLebeau Спасибо, это работает очень хорошо, как вы указали после присвоения TIdNTLMAuthentication свойству AuthenticationClass в событии TIdHTTP.OnSelectAuthorization. И присвоил False свойству TIdHTTP.Request.BasicAuthentication. Затем, как вы также указали относительно начальных учетных данных пользователя перед вызовом TIdHTTP.Get(), вы можете добавить его в качестве ответа, потому что это действительно помогло мне. я ценю вашу помощь.   -  person RepeatUntil    schedule 20.05.2016