2011-08-11 106 views
26

什麼是使用HttpUrlConnection使用搶先式基本http認證的最佳方式。 (現在假設我不能使用HttpClient)。HttpUrlConnection的搶先基本身份驗證?

編輯澄清:我使用Base64編碼在請求標頭中正確設置un/pw。是否有任何額外的標誌或屬性需要設置,或者是我爲請求設置基本auth標頭,這一切都是搶先式基本auth所需要的?

回答

78
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 
String encoded = Base64.getEncoder().encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8)); //Java 8 
connection.setRequestProperty("Authorization", "Basic "+encoded); 


然後使用正常的連接。

如果您使用的是Java 7或更低,你需要一個方法將字符串編碼爲Base64,如:

byte[] message = (username+":"+password).getBytes("UTF-8"); 
String encoded = javax.xml.bind.DatatypeConverter.printBase64Binary(message); 

是的,這就是你必須按順序使用基本做到驗證。上面設置請求屬性的代碼應該在打開連接之後以及獲取輸入或輸出流之前立即完成。

+0

是的,這就是我現在正在做的事情(請參閱編輯)。 –

+0

是的,這就是你必須要做的。 – dontocsata

+0

很酷,謝謝。事實證明我的問題在其他地方。我知道有一個HttpClient的setPreemptiveAuth類型接口,想知道是否有類似的HttpUrlConnection。 –

2

順便說一句,如果您使用org.apache.commons.codec.binary.Base64並且Base64.encodeBase64String(),萬一有人遇到同樣的問題,android問題也會出現。你需要做Base64.encodeBase64()並得到一個字節[]然後構造字符串。

它完全阻止了我,因爲這兩種方法之間的結尾會有不同的結果。

-1

關於Base64編碼問題,我發現這個庫:http://sourceforge.net/projects/migbase64/

我還沒有完全覈實它,但我使用它上面顯示的基本認證溶液(以及用於圖像編碼/解碼),並它運作良好。它提供了是否包含換行符的參數。

0

我是有這個問題了。 現在我已經解決了這個問題。 我的代碼是:

URL url = new URL(stringUrl); 

    String authStr = "MyAPIKey"+":"+"Password"; 
    System.out.println("Original String is " + authStr); 

// encode data on your side using BASE64 
    byte[] bytesEncoded = Base64.encodeBase64(authStr .getBytes()); 
    String authEncoded = new String(bytesEncoded); 

    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setRequestProperty("Authorization", "Basic "+authEncoded); 

它可以幫助很多人。 祝你好運。