2010-11-25 21 views
1

J'implémente la fonctionnalité Single Sign-On pour la connexion automagique à un site Web affilié https en utilisant l'authentification Digest. À l'heure actuelle mon code estAuthentification Digest utilisant 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(); 
    } 
} 

Le problème est que je reçois

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) 

qui, je suppose, est logique, mais ne me permet pas. Comment pourrais-je créer une requête/réponse pour me connecter ici (et éventuellement obtenir un sessionId)?

Merci d'avance.

+0

Peut-on voir le stacktrace complet? Je ne suis pas sûr quelle ligne de votre méthode échoue. –

+0

ajouté - merci d'avoir pris le temps. – heeboir

Répondre

5

Vous ne pouvez pas modifier un en-tête de demande de connexion lorsqu'il a déjà été connecté (vous avez déjà envoyé un en-tête de demande). Vous devrez faire une nouvelle connexion pour la deuxième requête.

E.g.

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

Vous pouvez ensuite obtenir l'ID session ou plutôt le cookie à partir de l'en-tête.

Il pourrait être plus facile à utiliser la capacité Digest apache HttpClient: http://hc.apache.org/httpclient-3.x/authentication.html

+0

en créant une nouvelle connexion renvoie la même réponse 401 qu'avant. – heeboir

+0

Mais vous ne recevez pas l'exception originale, n'est-ce pas? Votre autorisationRequest peut ne pas être correcte. Quel est l'en-tête de réponse? – morja

+0

à la fin j'ai eu ce travail en utilisant HttpClient. Beaucoup plus simple et plus facile! – heeboir