【发布时间】:2017-04-04 18:18:52
【问题描述】:
我正在尝试通过经过身份验证的代理发出请求,如下所示
HttpHost proxy = new HttpHost("http-proxy", 80);
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(
user, password));
try (CloseableHttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(credsProvider)
.build()) {
HttpPost post = new HttpPost(url);
RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
post.setConfig(config);
post.setEntity(new UrlEncodedFormEntity(urlParameters));
HttpResponse response = client.execute(post);
return response;
}
我的问题是它给了我以下错误,我不太明白。我怀疑我可能没有使用正确的类来进行身份验证。
WARNING: NEGOTIATE authentication error: No valid credentials provided (Mechanism level: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt))
WARNING: KERBEROS authentication error: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
WARNING: NTLM authentication error: Credentials cannot be used for NTLM authentication: org.apache.http.auth.UsernamePasswordCredentials
【问题讨论】:
-
我一般对 HTTP 身份验证了解不多,但这些消息意味着您的客户端不知道代理期望哪种身份验证,因此它尝试 SPNego (除其他外? ?),首先使用 Kerberos,然后使用 NTLM。两者都失败了。
-
顺便说一句,您为什么尝试像处理某种常规 HTTP 站点一样处理代理? Java 有一个特定的代理工具包,即
Proxy和SocketFactory等。我记得将这些东西用于 FTP 和 SFTP 连接(使用 Apache commons.net 和 SSHJ - 都支持自定义SocketFactory)。 -
apache 示例让我以这种方式处理代理。您是否建议我尝试使用开箱即用的 java.net api 重写它?
-
[耸肩] 随心所欲。但我担心 Apache 示例与 Apache 玩具代理和 Apache 玩具网站配合得很好;现实世界要复杂一些。顺便说一句,您是否简单地尝试了
curl与适当的代理参数和调试跟踪,看看它使用了什么样的 auth / headers? -
我不确定我是否熟悉 curl
标签: java authentication apache-httpcomponents