2011-08-11 15 views
26

HttpUrlConnectionを使用してプリエンプティブな基本的なHTTP認証を使用する最良の方法は何ですか。 (今は私がHttpClientを使用することはできません)。HttpUrlConnectionを使用したプリエンプティブな基本認証?

説明のためにEDIT:Base64エンコーディングを使用してリクエストヘッダー内にun/pwを正しく設定しています。追加のフラグやプロパティを設定する必要がありますか、またはプリエンプティブ基本認証に必要なすべてのリクエストの基本認証ヘッダーを設定していますか?

答えて

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); 

はい、それはあなたがBasicを使用するためにしなければならないすべてですAuth。 Requestプロパティを設定する上のコードは、接続を開いた後、入力ストリームまたは出力ストリームを取得する直前に実行する必要があります。

+0

はい、これは私が今やっていることです(編集を参照)。 –

+0

はい、それだけです。 – dontocsata

+0

クール、ありがとう。私の問題は他の場所にあることが判明しました。私は、HttpClientのsetPreemptiveAuth型インターフェイスがあることを知っていました.HttpUrlConnectionに類似したものがあるかどうか疑問に思っていました。 –

2

なお、org.apache.commons.codec.binary.Base64を使用してBase64.encodeBase64String()を使用すると、他の人が同じ人に遭遇した場合、アンドロイドの問題が発生します。 Base64.encodeBase64()を実行し、byte []を取得して文字列を構築する必要があります。

私は、これらの2つの方法の間に終わる線の結果が異なることを完全に私に伝えました。

-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); 

です。 運が良かったです。

関連する問題