Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 3678
  • Last Modified:

Indy (Delphi) Http Client and Digest Authentication

I'm trying to communicate with a server that needs digest authentication.

My Code:
uses IdHttp, IdAuthenticationDigest;

...

begin
  IdHttp1 := TIdHttp.Create(nil);
  try
    IdHttp1.Request.Username := 'xxx';
    IdHttp1.Request.Password := 'xxx';
        
    Result := IdHttp1.Get(URL)
   finally
    idHttp1.Free;
   end;
end; 

Open in new window

Unfortunately I get a 401 from the server. Both Firefox and Chrome connect fine if I enter the username and password.

I've the latest Indy 10 from SVN and Delphi 7.

The header of the server (on LAN):
Connecting...
Resolving hostname dm7020hd.
Connecting to 192.168.1.10.
Connected.
Server: webserver/1.0
Date: Thu, 31 Jan 2013 11:28:32 GMT
WWW-Authenticate: Digest algorithm="MD5", realm="Forbidden", qop="auth", opaque="7edfc2c756ad1f795651f15f88c32b25", nonce="d2ef913b753b3b6ad8878b34b93cfc5a"
Content-Type: text/html
Cache-Control: no-store, no-cache, must-revalidate
Expires: Sat, 10 Jan 2000 05:00:00 GMT
Content-Length: 15
Last-Modified: Thu, 31 Jan 2013 11:28:32 GMT
ETag: "753868328"
Connection: close
Disconnected

Open in new window

.
0
Casady
Asked:
Casady
1 Solution
 
aikimarkCommented:
when you are entering the uid/pwd manually, is it with http or https?
0
 
CasadyAuthor Commented:
http
0
 
rinfoCommented:
I understand  Result := IdHttp1.Get(URL) would be like this


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

Besides you need to use this as well
 idHttp.Request.BasicAuthentication := False;

and
idHttp.Request.ContentType := self.inputType;
idHttp.Request.Accept := self.outputType;
0
Veeam Disaster Recovery in Microsoft Azure

Veeam PN for Microsoft Azure is a FREE solution designed to simplify and automate the setup of a DR site in Microsoft Azure using lightweight software-defined networking. It reduces the complexity of VPN deployments and is designed for businesses of ALL sizes.

 
CasadyAuthor Commented:
@rinfo

BasicAuthentication is set to False by default, so changing it to False brings nothing.

Default ContentType is empty and default Accept is text/html, */*

 self.inputType is of course not defined (I have no idea what you are referring to).
0
 
rinfoCommented:
idHttp.Request.ContentType := '*/*';
idHttp.Request.Accept := 'text/html';

Important is you should set url according to submit method - Get or Post
if url has get request you should use this
      Result := IdHttp.Get(self.ServiceHost + url)
If data are posted then you should use this
      Result := IdHttp.Post(self.ServiceHost + url, SendStream);
0
 
CasadyAuthor Commented:
How can I determine if a URL needs Get or Post? Currently I'm using Get only.

idHttp.Request.ContentType := '*/*';
idHttp.Request.Accept := 'text/html';

made no difference.
0
 
CasadyAuthor Commented:
I have more infos.

I've created two events to watch what's going on during connect.
procedure  Auth(Sender: TObject; Authentication: TIdAuthentication; var Handled: Boolean);
procedure AuthSelect(Sender: TObject; var AuthenticationClass: TIdAuthenticationClass; AuthInfo: TIdHeaderList);

...

IdHTTP1.OnAuthorization := Auth;
IdHTTP1.OnSelectAuthorization := AuthSelect;

Open in new window

When OnSelectAuthorization is fired

AuthenticationClass is:

TIdDigestAuthentication

AuthInfo is:

Digest algorithm="MD5", realm="Forbidden", qop="auth", opaque="1f4ffff678e1ac3ca5a49a44001fb374", nonce="1b2a0979d3adff70d59e1d11f6315df1"

But OnAuthorization is NOT fired at all!
0
 
CasadyAuthor Commented:
@sinisav

I've read these threads and about 100 others 1 week before. They don't offer any solutions.

The first thread you've posted is about basic authentication (not related to my problem of digest authentication).

The second thread is the same problem as mine, but offers NO solution (like many others where user asks questions like mine, but get no solution).

The third thread is almost 10 years old, where Indy digest authentication was not fully implemented (and offers also no solution).
0
 
CasadyAuthor Commented:
I've received the solution in another forum.

Here it is in case someone else has this problem:

IdHTTP1.HttpOptions  := IdHTTP1.HttpOptions + [hoInProcessAuth];

Open in new window

0
 
CasadyAuthor Commented:
Received solution in another forum.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now