Base64编码基本身份验证标头Apache HTTP客户端
两个相关的问题,我使用的是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进行基本身份验证的正确方法吗?或者有更清洁/更简单的方法。
对于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")
);
HttpClient
不尝试来源或代理服务器认证除非明确提出质疑。我怀疑你想要HttpClient
抢先认证。而抢占认证每缺省禁用(和我个人阻碍其安全或内部网络外部应用),可以使用例如力以下
感谢您的回复oleg - 太忙了,无法验证它是否有效,但会得到它。 – gamozzii
我试图从溶液中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响应
我猜你的答案的第二个字是错字。 “累” - >“试过” – Vasif
我知道这是一个很老的帖子。但是,只是想回答,以便其他人将来可以受益:
如果您使用的用户名将使用可变宽度编码(http://en.wikipedia.org/wiki/Variable-width_encoding)表示,请确保您更改用于形成字节的编码对于(用户名:密码)如下: HttpParams params = new BasicHttpParams(); params.setParameter(AuthPNames.CREDENTIAL_CHARSET,HTTP。UTF_8);
默认情况下,使用的编码是HttpProtocolParams.HTTP_ELEMENT_CHARSET。
谢谢TEG - 我试过这个,但没有成功(尝试了文字'基本'和常量。)。我已经更新了这个问题以反映这个额外的参数。尽管如此,基础64编码头仍然可以解决工作问题。 – gamozzii