2017-01-17 9 views
1

私はセキュアなHTTP接続を確立し、後でInputStreamを取得しようとします。接続が発生し、データを取得できますが、実際にサーバーに2つの認証要求を送信していますか?ここでは、接続を取得し、確立された入力ストリームを取得している私のコードは次のとおりです。HttpsURLConnectionは2回認証されていますか?

someConnection = (HttpsURLConnection) url.openConnection(); 
String userPass = username + ":" + password; 
String basicAuth = "Basic" + new String(new Base64().encode(userPass.getBytes())); 
someConnection.setRequestProperty("Authorization", basicAuth);    
if (header != null) someConnection.setRequestProperty(header, headerValue); 
InputStream is = someConnection.getInputStream(); 

.getInputStream()メソッドが呼び出されるまでトラフィックがありません。

Wireshark output

それはそれをやっている理由を任意のアイデア:それから私は、承認のための2つの要求を参照してください?何らかの理由で最初の要求が失敗しているように見えます。

+0

'' Basic'の後ろに '' Basic ''を' 'Basic" ''に置き換えてみてください –

+0

スペースを追加することで問題は解決しましたが、スペースなしで2回目常に正しく認証されています。 –

答えて

1

あなたヘッダAuthorizationの値が期待されるフォーマットと一致しない場合、それはベース64のRFC2045-MIME変異体(Basic access authenticationの詳細)で符号化${username}:${password}続い"Basic "であるべきです。

ここで、Basicの後に後続のスペースを追加することを忘れて、この予期しない動作につながる認証が正しく行われないようにします。

1

"Basic"とbase64でエンコードされたデータの間にはスペースが必要です。

これがなければ、認証ヘッダーは間違っています。最初のリクエストで401が受信され、別のソース(JAAS?)から取得された別の資格情報で次のリクエストを送信すると思います。

関連する問題