NTLMを使用してDefaultHttpClientのプリエンプティブ認証を実装したいと思います。通常の認証で正常に機能するDanHounshellのライブラリを見つけました。
しかし、プリエンプティブ認証でこれを機能させる方法を理解することはできません。このクールな答えで、 ApacheHttpClient4を使用したプリエンプティブ基本認証という質問を見つけました。
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(username, password);
HttpRequest request = ...
request.addHeader(new BasicScheme().authenticate(creds, request));
私の問題には完璧ではありませんが、良い考えです。そこで、を使用してwithNTLMSchemeFactory
の新しいインスタンスを作成しようとするAuthScheme
と、関数が得られauthenticate
ます。
NTCredentials ntc = new NTCredentials("example.com/user:pwd");
httpPost.addHeader(new NTLMScheme(new JCIFSEngine()).authenticate(ntc, httpPost));
この関数が呼び出されると、例外が発生します。
org.apache.http.auth.AuthenticationException:予期しない状態:UNINITIATED
どうすれば修正できますか?
POST /login/ HTTP/1.1
Content-Length: 21
Content-Type: application/x-www-form-urlencoded
Host: example.com
Connection: Keep-Alive
data=...
HTTP/1.1 401 Unauthorized
Content-Type: text/html
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Wed, 12 Dec 2012 14:36:26 GMT
Content-Length: 1344
Much data...
POST /login/ HTTP/1.1
Content-Length: 21
Content-Type: application/x-www-form-urlencoded
Host: example.com
Connection: Keep-Alive
Authorization: NTLM AAABBBCCC...FFF==
data=...
最初のリクエストは絶対に役に立たないと思います。