HttpClient 4.2、基本身份验证和 AuthScope

Posted

技术标签:

【中文标题】HttpClient 4.2、基本身份验证和 AuthScope【英文标题】:HttpClient 4.2, Basic Authentication, and AuthScope 【发布时间】:2012-06-01 12:18:46 【问题描述】:

我有一个应用程序连接到需要基本身份验证的网站。这些站点是在运行时提供的,在编译时是未知的。

我正在使用 HttpClient 4.2。

我不确定下面的代码是否是我应该指定基本身份验证的方式,但文档会建议这样做。但是,我不知道在AuthScope 的构造函数中传递什么。我原以为 null 参数意味着提供的凭据应该用于所有 URL,但它会抛出 NullPointerException,所以很明显我错了。

m_client = new DefaultHttpClient();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(m_userName, m_password);
((DefaultHttpClient)m_client).getCredentialsProvider().setCredentials(new AuthScope((HttpHost)null), credentials);

【问题讨论】:

client.getCredentialsProvider()。 setCredentials(new AuthScope(proxyHost, proxyPort), new UsernamePasswordCredentials(proxyUser, proxyPassword));这是正确的方法 【参考方案1】:

AuthScope.ANY 是您所追求的:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/AuthScope.html

试试这个:

    final HttpClient client = new HttpClient();
    client.getParams().setAuthenticationPreemptive(true);
    client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user.getUsername(), user.getPassword()));
    final GetMethod method = new GetMethod(uri);
    client.executeMethod(method);

【讨论】:

谢谢基兰。我在客户端上没有getState 方法,但我想我们只是使用不同的版本。我按照您的建议尝试了AuthScope.ANY,它奏效了-谢谢。我可以再问你一个问题吗?setAuthenticationPreemptive(true) 是必要的/推荐的吗? 我花了一段时间才看到这条评论。 setAuthenticationPreemptive(true) 表示凭据将在初始请求中发送,而无需首先尝试没有凭据的请求,然后获得 401,然后在受到挑战时提供它们。 HttpClient4.1没有这个方法【参考方案2】:

至少从 4.2.3 版开始(我猜是在 3.X 版之后),接受的答案不再有效。相反,请执行以下操作:

private HttpClient createClient() 
    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setContentCharset(params, "UTF-8");

    Credentials credentials = new UsernamePasswordCredentials("user", "password");
    DefaultHttpClient httpclient = new DefaultHttpClient(params);
    httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, credentials);

    return httpclient;

AuthScope.ANY 的 JavaDoc 说 在未来的 HttpClient 版本中将停止使用此参数,因此使用它需要您自担风险。更好的选择是使用AuthScope 中定义的构造函数之一。

有关如何使请求抢占式的讨论,请参阅:

Preemptive Basic authentication with Apache HttpClient 4

【讨论】:

以上是关于HttpClient 4.2、基本身份验证和 AuthScope的主要内容,如果未能解决你的问题,请参考以下文章

csharp 使用基本身份验证和代理的简单C#.NET 4.5 HTTPClient请求

使用 HttpClient 在 Java 中进行 Http 基本身份验证?

Angular 6 - httpClient 在 httpOptions 中传递基本身份验证

使用 Java 和 apache HttpClient 的 Apache Shiro authcBasic 身份验证

如何使用基于 HttpClient 和 .net4 的 Rest-client 进行身份验证

来自 C# HttpClient 针对 Spring 服务器 JWT 令牌的身份验证