2010-11-25 90 views
1

ダイジェスト認証を使用して、関連するhttpsウェブサイトに自動的にログインするためのシングルサインオン機能を実装しています。現在、私のコードはURLConnectionを使用したダイジェスト認証

URL url = new URL(protocol, ip, port, path); 
URLConnection connection = url.openConnection(Proxy.NO_PROXY); 
connection.connect(); 

if (connection != null && connection.getHeaderFields() != null) { 
    if (connection.getHeaderFields().get(AUTHENTICATE_RESPONSE_HEADER) != null) { 
     Map<String, String> authenticateParameters = identifyAuthentication(connection); 

     String ha1 = calculateMD5(username + ":" + authenticateParameters.get("realm") + ":" + password); 
     String ha2 = calculateMD5("GET" + ":" + path); 
     String response = calculateMD5(ha1 + ":" + 
      authenticateParameters.get("nonce") + ":" + 
      "00000001" + ":" + 
      authenticateParameters.get("qop") + ":" + 
      ha2); 

      String authorizationRequest = authenticateParameters.get("challenge") + " " + 
        "username=" + username + ", " + 
        "realm=" + authenticateParameters.get("realm") + ", " + 
        "nonce=" + authenticateParameters.get("nonce") + ", " + 
        "uri=" + path + ", " + 
        "qop=" + authenticateParameters.get("qop") + ", " + 
        "nc=" + "00000001" + ", " + 
        "response=" + response + ", " + 
        "opaque=" + authenticateParameters.get("opaque"); 

      connection.setAllowUserInteraction(true); 
      connection.addRequestProperty(AUTHENTICATION_REQUEST_PROPERTY, authorizationRequest); 
      connection.getHeaderFields(); 
    } 
} 

問題は、私は理にかなっているが、私を助けていない、私は推測する、

java.lang.IllegalStateException: Already connected 
    at java.net.URLConnection.addRequestProperty(URLConnection.java:1061) 
    at sun.net.www.protocol.http.HttpURLConnection.addRequestProperty(HttpURLConnection.java:2016) 
    at com.ibm.net.ssl.www2.protocol.https.a.addRequestProperty(a.java:49) 

を得ることです。ここでログインするためのリクエスト/レスポンスを作成するにはどうしたらいいですか?

ありがとうございます。

+0

は、我々は完全なスタックトレースを見ることができますか?あなたのメソッドのどの行が失敗しているのかは分かりません。 –

+0

が追加されました。時間を割いていただきありがとうございます。 – heeboir

答えて

5

接続要求ヘッダーが既に接続されている(要求ヘッダーを既に送信している)場合は、変更できません。 2番目のリクエストに対して新しい接続を確立する必要があります。

など。

connection = url.openConnection(Proxy.NO_PROXY); 
connection.addRequestProperty(AUTHENTICATION_REQUEST_PROPERTY, authorizationRequest); 
connection.getHeaderFields(); 

次に、ヘッダーからsessionIdまたはcookieを取得できます。

ApacheのHttpClientのダイジェスト機能を使用する方が簡単かもしれません:http://hc.apache.org/httpclient-3.x/authentication.html

+0

新しい接続を作成すると、以前と同じ401の返信が返されます。 – heeboir

+0

元の例外はありませんか?あなたのauthorizationRequestが正しくない可能性があります。レスポンスヘッダーとは何ですか?最後に – morja

+0

私はこれをHttpClientを使って動作させました。はるかに簡単で簡単です! – heeboir

関連する問題