Base64编码基本身份验证标头Apache HTTP客户端

时间:2011-12-01 08:18:52

标签: java apache authentication httpclient basic-authentication

两个相关的问题,我正在使用Apache HTTP Client 4.x API。 myHttpPost是HttpPost的一个实例,myHttpClient是HttpClient的一个实例。我正在尝试使用基本身份验证发送请求。所以我有一个HttpClient并创建一个HttpPost。

设置基本身份验证标头的“强力”方式似乎是在HttpPost标头中设置它。

String encoding = Base64Encoder.encode("username" + ":" + "password");
myHttpPost.setHeader("Authorization", "Basic " + encoding);

上面的例子来自另一个堆栈溢出问题(现在找不到它的链接)。关于Base64Encoder类 - 我会在哪个包中找到它或从哪里下载它?

主要问题 - 我希望使用以下代码以更美观的方式进行基本身份验证:

myHttpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthPolicy.BASIC),
    new UsernamePasswordCredentials("username", "password")
);

但这似乎不起作用。那么上面的第一个例子是使用Apache HTTP Client 4.0进行基本身份验证的正确方法吗?或者是否有更清洁/更简单的方式。

4 个答案:

答案 0 :(得分:4)

  

关于Base64Encoder类 - 我会找到它   我会从哪里下载?

Base64Encoder可以来自不同的地方,我找不到与您的静态encode方法匹配的内容。

对于凭据,您需要在scheme上将Basic设置为AuthScope,如下所示:

myHttpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),
    new UsernamePasswordCredentials("username", "password")
);

myHttpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthPolicy.BASIC),
    new UsernamePasswordCredentials("username", "password")
);

答案 1 :(得分:2)

我知道这是一个非常古老的帖子。但是,只是想回答以便其他人将来会受益:

如果您使用的是使用可变宽度编码(http://en.wikipedia.org/wiki/Variable-width_encoding)表示的用户名,请确保更改用于形成(username:password)字节的编码,如下所示: HttpParams params = new BasicHttpParams(); params.setParameter(AuthPNames.CREDENTIAL_CHARSET,HTTP.UTF_8);

默认情况下,使用的编码是HttpProtocolParams.HTTP_ELEMENT_CHARSET。

答案 2 :(得分:1)

HttpClient不会尝试使用来源或代理服务器进行身份验证,除非明确提出质疑。我怀疑你希望HttpClient先发制人地进行身份验证。虽然默认情况下禁用抢先身份验证(我个人会阻止其在安全或内部网络之外的应用程序),但可以使用下面的示例强制执行抢先身份验证

http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientPreemptiveBasicAuthentication.java

答案 3 :(得分:1)

我尝试了http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientPreemptiveBasicAuthentication.java中建议的解决方案,它适用于Base64编码基本身份验证。

 // Create AuthCache instance
 AuthCache authCache = new BasicAuthCache();
 // Generate BASIC scheme object and add it to the local
 // auth cache
 BasicScheme basicAuth = new BasicScheme();
 authCache.put(target, basicAuth);

 // Add AuthCache to the execution context
 HttpClientContext localContext = HttpClientContext.create();
 localContext.setAuthCache(authCache);

创造奇迹:) 如果没有这个我总是收到" 401 Unauthorized" HTTP响应