Hi folks,

I'd like to you to update on the status of my rewrite challenge:

It did not turn out to be as easy as I have assumed. I debugged a lot of stuff, read the code, etc. HttpClient is well implementing RFC 2617 auth schemes which are all request-based (stateless), challenge-response (server-first) and one way.

Unfortunately this does not work for *any* GSS-API/SSPI mech(s) (SPNEGO, Kerberos, NTLM) which are connection-based (stateful), challenge-response (but *client-first!*, consider: "WWW-Authenticate: Negotiate/Kerberos/NTLM" is /not/ a challenge) and optionally mutual (WWW-Athenticate on non-401/407). This is a complete contradiction to RFC 2617.

I wrote a simple PingPingAuthenticator (in Tomcat) and a PingPingScheme which do the following on the connection:

C: GET /secure
S: HTTP/1.1 401 Unauthorized
S: WWW-Authenticate: PingPong
#(1) Client will discard response body
C: GET /secure
C: Authorization: PingPong 1
S: HTTP/1.1 401 Unauthorized
S: WWW-Authenticate: PingPong 2
#(2) Client will discard response body
C: GET /secure
C: Authorization: PingPong 3
S: HTTP/1.1 200 OK
#(2) Client has to read in the header, validate and the use response body
S: WWW-Authenticate: PingPong GameOver
S: Response...

See: http://tools.ietf.org/html/rfc4559#section-5

I see that the code completely ignores "PingPong GameOver". Oleg's hack won't work because #processResponse cannot throw an AuthenticationException in the case that the (opaque) token is invalid and consume non-401/407 response. Even if that would work, MainClientExec would need to know first when to pass that in again by calling authenticator#isAuthenticationRequested along with a proper AuthenticationStrategy implementation but after that MainExecClient consumes the HttpEntity. It assumes that auth is unconditionally in handshake state.

Additionally, HttpAuthenticator probably requires some rewrite to accommodate all of those changes (inversion).

Currently, I do not know how to solve this problem best. It might be necessary to introduce two new methods to AuthScheme

1. #isClientFirst
2. #isMutual

but this still has to be determined.

In advent of a suitable replacement for Digest, there is also a RFC draft for SCRAM-SHA-1 over HTTP [1]. If someone considers to implement that in HttpClient, forget it. It is client-first (if required) and mutual.

Currently, I *do not* recommend using the current implementations at all. Rather create a JGSS/SSPI context manually, pass tokens and establish the context.

This is -- in short -- it for now.

Comments, implementation tips, other thoughts, etc. are highly welcome.

I will keep you updated,

Michael

[1] http://datatracker.ietf.org/doc/draft-melnikov-httpbis-scram-auth/?include_text=1

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to