2

Trying to do a get() with Digest to a partner's web service with Delphi XE.

I have included IdAuthenticationDigest to the uses clause which should automatically work from what I've read - but I must be missing something because I'm getting a 401 Unauthorized.

Code:

begin
  // Init request:   
  IdHttp := TIdHttp.Create(nil);
  try
    idHttp.Request.ContentType := self.inputType; // 'application/xml'
    idHttp.Request.Accept := self.outputType; //'application/json';

    // Set request method:
    idHttp.Request.Method := Method; // 'Get'
    // Set username and password:
    idHttp.Request.BasicAuthentication := False;
    // IdHttp.Request.Username/Password also fails
    IdHttp.Request.Authentication.Username := 'xx';
    IdHttp.Request.Authentication.password := 'xx';

    IdHttp.Request.ContentLength := Length(Body);

    // Send request:
    if Method = 'GET' then
      Result := idHttp.Get(self.ServiceHost + URI)
    else
    if Method = 'POST' then
      Result := idHttp.Post(self.ServiceHost + URI, SendStream);

   finally
    idHttp.Free;
   end;
end;
4

3 に答える 3

4

プロパティを使用する代わりにRequest.Username、プロパティを設定する必要があります。また、またはプロパティはまったく設定しないでください。これら3つのプロパティはすべて、内部で管理されています。Request.PasswordRequest.AuthenticationRequest.MethodRequest.ContentLengthTIdHTTP

  // Init request:   
  IdHttp := TIdHttp.Create(nil);
  try
    idHttp.Request.ContentType := self.inputType; // 'application/xml'
    idHttp.Request.Accept := self.outputType; //'application/json';

    // Set username and password:
    idHttp.Request.BasicAuthentication := False;
    IdHttp.Request.Username := 'xx';
    IdHttp.Request.Password := 'xx';

    // Send request:
    if Method = 'GET' then
      Result := IdHttp.Get(self.ServiceHost + URI)
    else
    if Method = 'POST' then
      Result := IdHttp.Post(self.ServiceHost + URI, SendStream);
   finally
    IdHttp.Free;
   end;
于 2012-08-21T16:23:29.170 に答える
4

次のような OnAuthorization イベントを追加します。

procedure TForm1.IdHTTP1Authorization(Sender: TObject;
  Authentication: TIdAuthentication; var Handled: Boolean);
begin
Authentication.Username:='user';
Authentication.Password:='passs'; 
if Authentication is TIdDigestAuthentication then
  begin
    showmessage('onAuthorization: '+Authentication.Authentication);
    TIdDigestAuthentication(IdHTTP1.Request.Authentication).Uri:=IdHTTP1.Request.URL;
    TIdDigestAuthentication(Authentication).Method := 'GET';
  end;
Handled:=true;
end;

時々、インディは必要な情報を見逃すことがあります。私の場合、Tomcat サーバーに接続していますが、ダイジェスト パラメータ認証情報が送信されるときに Get メソッドが必要です。

于 2012-10-16T21:53:07.023 に答える
2

GET を実行する前に、 hoInProcessAuthフラグも設定する必要があります。

idHttp.HTTPOptions := idHttp.HTTPOptions + [hoInProcessAuth];
于 2014-08-06T15:07:35.793 に答える