2011-12-01 153 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。

相關問題