两个相关的问题,我正在使用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进行基本身份验证的正确方法吗?或者是否有更清洁/更简单的方式。
答案 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
先发制人地进行身份验证。虽然默认情况下禁用抢先身份验证(我个人会阻止其在安全或内部网络之外的应用程序),但可以使用下面的示例强制执行抢先身份验证
答案 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响应