Дайджест-аутентификация с использованием URLConnection - PullRequest
1 голос
/ 25 ноября 2010

Я реализую функцию единого входа для автоматического входа на аффилированный веб-сайт https с использованием дайджест-аутентификации.В настоящее время мой код

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)

, что, я думаю, имеет смысл, но не помогает мне.Как мне создать запрос / ответ для входа в систему (и в конечном итоге получить идентификатор сеанса)?

Заранее спасибо.

1 Ответ

5 голосов
/ 25 ноября 2010

Вы не можете изменить заголовок запроса на подключение, если он уже был подключен (вы уже отправили заголовок запроса).Вам нужно будет установить новое соединение для второго запроса.

Например,

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

Затем вы можете получить sessionId или, скорее, cookie из заголовка.может быть проще использовать возможность Apache HttpClient's Digest: http://hc.apache.org/httpclient-3.x/authentication.html

...