La autenticación implícita utilizando URLConnection
-
28-09-2019 - |
Pregunta
Me estoy poniendo en práctica inicio de sesión único para el registro de funcionalidad en automágicamente a un sitio web afiliado HTTPS utilizando la autenticación implícita. Actualmente es mi código
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();
}
}
El problema es que tengo
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)
lo que, supongo, tiene sentido, pero no me ayuda. ¿Cómo hago para la creación de una petición / respuesta para el registro aquí (y eventualmente conseguir un sessionId)?
Gracias de antemano.
Solución
No se puede modificar un encabezado de solicitud conexiones cuando ya ha sido conectado (ya ha enviado un encabezado de la solicitud). Usted tendrá que hacer una nueva conexión para la segunda solicitud.
por ejemplo.
connection = url.openConnection(Proxy.NO_PROXY);
connection.addRequestProperty(AUTHENTICATION_REQUEST_PROPERTY, authorizationRequest);
connection.getHeaderFields();
A continuación, puede obtener la sessionId o más bien la cookie de la cabecera.
Puede ser que sea más fácil utilizar el Apache de HttpClient capacidad Digesto: http: // hc.apache.org/httpclient-3.x/authentication.html