Apache httpclient 4.5.3 SPNEGO 握手不存储 cookie
Apache httpclient 4.5.3 SPNEGO handshake does not store cookie
我正在尝试使用 SPNEGO 身份验证对后端执行 HTTP 调用。根据跟踪日志,SPNEGO 身份验证部分本身似乎可以工作,但登录失败,因为服务器后端是有状态的,并且 httpclient 没有使用它在第一个 401 响应中发回的 session cookie。我可以在跟踪日志中看到 httpclient 如何发送第一个请求,获得带有 "set-cookie" header 的 401,但没有处理该 cookie;然后当 httpclient 使用 "Authorization" header 响应新请求时,没有 cookie;因此,服务器从头开始另一个登录并再次响应 401,新的 "set-cookie" header 和新的 session.
握手失败后,httpclient 确实处理新的第二个 session cookie 并存储它;这在跟踪日志中也可见。我的 cookie 处理代码如下所示:
BasicCookieStore cookieStore = new BasicCookieStore();
HttpClientBuilder clientBuilder = HttpClients.custom()
.setConnectionManager(SslHandler.createClientConnectionManager(adapterType))
.setRedirectStrategy(new IgnoreRedirectStrategy())
.setRetryHandler(new DefaultHttpRequestRetryHandler(2, true))
.setDefaultHeaders(allHeaders)
.setSSLHostnameVerifier(SslHandler.getHostnameVerifier(adapterType))
.setDefaultRequestConfig(defaultRequestConfig)
.setDefaultCookieStore(cookieStore);
RequestConfig localConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD)
.build();
request.setConfig(localConfig);
CloseableHttpClient client = clientBuilder.build();
localcontext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
org.apache.http.HttpResponse response = client.execute(request, localcontext);
所以基本上问题是:是否有必要做一些特殊的事情来在 SPNEGO 或 NTLM 握手期间启用存储/处理 cookie?它似乎在握手之外有效,但在握手期间无效。
我可以使用以下代码解决问题:
https://github.com/eveoh/ews-java-api/commit/c6f54bb9665c3b714e41ad43ebe31527f77b59fe
有了它,cookie 在握手过程中被正确存储和使用。
我正在尝试使用 SPNEGO 身份验证对后端执行 HTTP 调用。根据跟踪日志,SPNEGO 身份验证部分本身似乎可以工作,但登录失败,因为服务器后端是有状态的,并且 httpclient 没有使用它在第一个 401 响应中发回的 session cookie。我可以在跟踪日志中看到 httpclient 如何发送第一个请求,获得带有 "set-cookie" header 的 401,但没有处理该 cookie;然后当 httpclient 使用 "Authorization" header 响应新请求时,没有 cookie;因此,服务器从头开始另一个登录并再次响应 401,新的 "set-cookie" header 和新的 session.
握手失败后,httpclient 确实处理新的第二个 session cookie 并存储它;这在跟踪日志中也可见。我的 cookie 处理代码如下所示:
BasicCookieStore cookieStore = new BasicCookieStore();
HttpClientBuilder clientBuilder = HttpClients.custom()
.setConnectionManager(SslHandler.createClientConnectionManager(adapterType))
.setRedirectStrategy(new IgnoreRedirectStrategy())
.setRetryHandler(new DefaultHttpRequestRetryHandler(2, true))
.setDefaultHeaders(allHeaders)
.setSSLHostnameVerifier(SslHandler.getHostnameVerifier(adapterType))
.setDefaultRequestConfig(defaultRequestConfig)
.setDefaultCookieStore(cookieStore);
RequestConfig localConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD)
.build();
request.setConfig(localConfig);
CloseableHttpClient client = clientBuilder.build();
localcontext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
org.apache.http.HttpResponse response = client.execute(request, localcontext);
所以基本上问题是:是否有必要做一些特殊的事情来在 SPNEGO 或 NTLM 握手期间启用存储/处理 cookie?它似乎在握手之外有效,但在握手期间无效。
我可以使用以下代码解决问题:
https://github.com/eveoh/ews-java-api/commit/c6f54bb9665c3b714e41ad43ebe31527f77b59fe
有了它,cookie 在握手过程中被正确存储和使用。