Hi Adrian,

Thank you for your detailed answer.  I'd just like to check that I've
understood okay, and ask one more favour (!):

1./ I can't determine what type of credentials I should use directly with
the HttpClient API.  I need to look at HTTP response headers and determine
that myself.  This leads onto another question... what headers are returned
by an NTLM-protected server to indicate that I need to authenticate with
NTLM -- so that I know what to "sniff" for, and what response does it
xpect  -- out of interest (I'd like a short example)?

2./ I should be using one instance of HttpClient per connected user, so that
I can reflect correctly the credentials for the end user (stored in the
state of the HttpClient).  In practice, I could store one instance of
HttpClient in the session attributes of the servlet context for the webapp
of the highlighting service.

3./ thanks for the example. it does help!

Sorry to ask such questions.  I don't have an NTLM test environment, so it's
fun trying to develop support for it..!!  Thanks for the help so far anyway!

- Chris

PS: re: the "limitation"... pester, pester, I'd be happy if it were fixed!
:)



----- Original Message -----
From: "Adrian Sutton" <[EMAIL PROTECTED]>
To: "'Commons HttpClient Project'"
<[EMAIL PROTECTED]>
Sent: Thursday, February 27, 2003 1:00 AM
Subject: RE: Using httpclient on the server to intercept and modify HTTP
response


> Hi Chris,
> HttpClient should be able to do everything you need it to, but you have
hit
> on one limitation that I've been meaning to fix for a long time now.
> There's ways around it and if you pester me enough I might finally get
> around to implementing it properly. :)  More below.
>
> >1./ when connecting to something with the HTTPClient API, how do I
> determine
> >dynamically which type of credentials I should use, if any?
>
> You can always use NTCredentials as they extend
UsernamePasswordCredentials,
> this is the approach I take.  There is a definitely limitation in
HttpClient
> that it doesn't tell you what credentials it needs.  This is part 1 of the
> stuff I've been meaning to do.  It should give you the Class for the
> credentials type and there should be some way of knowing what parameters
it
> needs as well.
>
> >2./ given that I'm forwarding requests from many clients via one host,
are
> >there any problems or pitfalls with multiple connections from that host
> >using different credentials for each client?  is there any caching for
> >example that might mean that the first NT login is used for some/all
> >subsequent requests that should in fact be using the credentials for a
> >different client?
>
> That depends.  Credentials are stored per realm and are cached in the
> HttpState instance for each HttpClient.  For NTLM, the domain name of the
> server is used as the realm.  So if you have two users with different
> credentials who attempt to access the same NTLM server, the credentials
will
> get mixed up.  You can (and should) however create a separate HttpState
for
> each client so that the credentials don't get mixed up too much and this
> will also prevent cookies getting mixed up and a bunch of other stuff.
>
> Laura has requested a version of executeMethod() in HttpClient that
accepts
> a specific state to use and that definitely seems like a good idea -
> currently she is using the HttpMethod's directly and not using the
> HttpClient class itself.  We'd like everyone to use the HttpClient class
as
> it makes development easier so I'm hoping that someone (possibly myself)
> will look into the possibility of implementing that for 2.0.  It depends
on
> how complex it is though.
>
> >3./ as I'll need to ask the client to provide credentials, I can either
use
> >a form or a BASIC authentification request.  If I limit the request to
> >"username" and "password" fields, can I safely request that the client's
> >username contains "DOMAIN\username" (and then decode it), as I'm not
clear
> >about where I should obtain domain names for?
>
> You could take that approach, or you could use the nasty hack below to
> detect if you're authenticating to NTLM or not and add a specific domain
> field to your auth dialog/form.
>
> The nasty hack to find out the realm to authenticate against and whether
or
> not you need a domain involves:
>   .....
>   // If you might have to authenticate with proxies, don't forget to
> check the
>   // Proxy-Authenticate header as well.
>         String realm =
get.getResponseHeader("WWW-Authenticate").getValue();
>         boolean isNTLM = (realm != null &&
> realm.toLowerCase().indexOf("ntlm") >= 0);
>         String tmpRealm;
>         if (isNTLM) {
>             if (proxy) {
>                 tmpRealm = client.getProxyHost();
>             } else {
>                 tmpRealm = src.getHost();
>             }
>         } else {
>             tmpRealm = parseRealmFromChallenge(realm);
>         }
>   // isNTLM now stores whether or not you need to get a domain from
> the user as well.
>   // tmpRealm now contains the name of the realm you're
> authenticating against.
> ....
>
>
>     // Blantantly ripped from HttpClient's Authenticator.java  You may
want
> to check for updates.
>     private String parseRealmFromChallenge(String challenge) {
>         log.trace("enter parseRealmFromChallenge(String challenge)");
>         try {
>             StringTokenizer strtok = new StringTokenizer(challenge, "=");
>             String realm = strtok.nextToken().trim();
>             int firstq = realm.indexOf('"');
>             int lastq = realm.lastIndexOf('"');
>
>             if ((firstq + 1) < lastq) {
>                 realm = realm.substring(firstq + 1, lastq);
>             }
>
>             return realm;
>         } catch (Exception ex) {
>             System.err.println("Failed to parse realm: " + challenge + " -
"
> + ex.getMessage());
>             return null;
>         }
>     }
>
> Hope that helps....
>
> Adrian Sutton, Software Engineer
> Ephox Corporation
> www.ephox.com
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail:
[EMAIL PROTECTED]
> For additional commands, e-mail:
[EMAIL PROTECTED]
>
>
>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to