2011-12-01 70 views
4

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

设置基本身份验证标头的'蛮力'方式似乎是将其设置在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

对于Base64Encoder类 - 哪个包可以在 中找到或在哪里下载?

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

至于凭证,您需要设置schemeBasicAuthScope,像这样:

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") 
); 
+0

谢谢TEG - 我试过这个,但没有成功(尝试了文字'基本'和常量。)。我已经更新了这个问题以反映这个额外的参数。尽管如此,基础64编码头仍然可以解决工作问题。 – gamozzii

1

HttpClient不尝试来源或代理服务器认证除非明确提出质疑。我怀疑你想要HttpClient抢先认证。而抢占认证每缺省禁用(和我个人阻碍其安全或内部网络外部应用),可以使用例如力以下

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

+0

感谢您的回复oleg - 太忙了,无法验证它是否有效,但会得到它。 – gamozzii

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未授权” HTTP响应

+0

我猜你的答案的第二个字是错字。 “累” - >“试过” – Vasif

1

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

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

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

相关问题