- From: Life is hard... and then you die. <Ronald.Tschalaer@psi.ch>
- Date: Mon, 6 Apr 1998 02:00:25 +0200
- To: GISLE@aas.no, HTTP-WG@cuckoo.hpl.hp.com
[Gisle Aas wrote:]
> 1) It is not perfectly clear to me if the namespace of realms are
> separate for each authentication scheme or even separate when using
> the server as a proxy and when not. I matters to me becase I try to
> index authentication objects in the client per "server/realm".
>
> This sentence:
>
> The realm value (case-sensitive), in combination with the canonical
> root URL (see section 5.1.2 of [2]) of the server being accessed,
> defines the protection space.
>
> make me believe that I can assume that it would not be possible to
> have to deal with all the following as separate "protection spaces"
> the same time:
>
> Authorization: Basic realm="foo"
> Authorization: Digest realm="foo"
> Proxy-Authorization: Basic realm="foo"
> Proxy-Authorization: Digest realm="foo"
Hmm, I assumed the protection space to be defined by the tuple
(host, port, scheme, realm), but you are right that it's not clearly
specified. However, I would not differentiate between Authorization and
Proxy-Authorization, although at least one popular server will allow
different auth info to be set up for a proxy and server on the same
host and port.
> 2) How to interpret the URIs in the 'domain' attribute of the Digest
> WWW-Authenticate is not clear to me either. Are the URIs in this
> list path prefixes that define protection spaces or must there be
> an exact match. If it is a prefix, what happens if the URI contains a
> query part.
An exact match. Although in my implementation I actually use these to
create new protection space tuples (if the host or port is different)
and to update a cache of URL's. This cache is then used to guess if a
specific URL needs authentication (for preemptive auth header
generation). I think this fits the intent too.
> 3) Section 3.6 does not seem to know about the "407 Proxy
> Authentication Required" status code. I though that a
> "Proxy-Authenticate" header could only be present in a 407 response.
> That is at least how I read <draft-ietf-http-v11-spec-rev-03>. I
> would like this paragraph to go away (it would complicate my
> implementation if it stays):
>
> Note that in principle a client could be asked to authenticate
> itself to both a proxy and an end-server. It might receive an
> "HTTP/1.1 401 Unauthorized" header followed by both a WWW-
> Authenticate and a Proxy-Authenticate header. However, it can
> never receive more than one Proxy-Authenticate header since such
> headers are only for immediate connections and must not be passed
> on by proxies. If the client receives both headers, it must
> respond with both the Authorization and Proxy-Authorization
> headers as described above, which will likely involve different
> combinations of username, password, nonce, etc.
How come this would complicate the implementation? Instead of doing
if (status == 401)
handle_auth_header
if (status == 407)
handle_proxy-auth_header
it becomes
if (status == 401)
handle_auth_header
handle_proxy-auth_header
if (status == 407)
handle_proxy-auth_header
Actually, now that you mention it, I'm not even really sure why the 407
is needed at all. The Authorization vs. Proxy-Authorization header gives
you enough info on where the challenge is coming from. Can anybody shed
some light on why 407 exists?
> 4) Are there any servers that already implemented that that knows
> about "MD5-sess" and "auth-int" I can test against?
I waiting too...
> For those that can read Perl, I even include the source for my
> implementation here. This code might even be of use to others
> implementing Digest or perhaps somebody can tell me if I misunderstood
> something in the spec by looking through the code.
I think there is a problem with the nonce-count and the MD5-sess
implementation. Assuming that _set_authorization is only called upon
receipt of a Authentication or Proxy-Authentication header (i.e. it's
not used for preemptively sending auth info) you need the following
changes:
> sub _set_authorization
> {
[snip]
> my $uri = $req->url->full_path;
> my $nonce = $self->{nonce}; $nonce = "" unless defined $nonce;
> my $nc = sprintf "%08x", ++$self->{nonce_count};
You need to reset the counter when a new nonce is received. Something
like
if ($self->{prev_nonce} ne $self->{nonce}) { $self->{nonce_count} = 0; }
$self->{prev_nonce} = $self->{nonce};
my $nc = sprintf "%08x", ++$self->{nonce_count};
> my $cnonce = sprintf "%x", rand(0x1000000);
>
> my $a1;
> if ($algorithm eq "md5") {
> # A1 = unq(username-value) ":" unq(realm-value) ":" passwd
> $a1 = MD5->hexhash("$user:$realm:$pass");
> } elsif ($algorithm eq "md5-sess") {
> # The following A1 value should only be computed once
> $a1 = $self->{'A1'};
> unless ($a1) {
should be
unless ($a1 && ($self->{stale} eq "true"))
(I believe this will be clarified in the next draft)
> # A1 = H( unq(username-value) ":" unq(realm-value) ":" passwd )
> # ":" unq(nonce-value) ":" unq(cnonce-value)
> $a1 = MD5->hexhash("$user:$realm:$pass") . ":$nonce:$cnonce";
> $a1 = MD5->hexhash($a1);
> $self->{'A1'} = $a1;
> }
> } else {
> return;
> }
[snip]
Cheers,
Ronald
Received on Sunday, 5 April 1998 17:09:19 UTC