2010-01-26 6 views
4

Je me demandais si l'un d'entre vous savait comment se déconnecter de l'authentification de base (BA) en utilisant la classe java.net.Authenticator. Je sais que BA n'a pas de méthode de déconnexion, et que vous devez fermer et rouvrir le navigateur pour mettre fin à la session. La question est, comment «fermez-vous et rouvrez-vous le navigateur» dans le code java? C'est-à-dire, je me connecte via Java, pas un Borwser, alors comment faire pour que la JVM se désauthentifie elle-même?Se déconnecter avec java.net.Authenticator

Contexte: J'écris une application pour poster des tweets à plusieurs comptes Twitter en utilisant BA. Je peux utiliser java.net. * Pour publier le tweet pour un compte (et peut voir qu'il appelle ma classe d'authentification) mais quand j'essaye de publier le tweet pour le second, je ne peux pas voir un second appel à l'authentificateur , et le tweet est renvoyé au premier compte.

Est-il possible d'authentifier l'Authenticator, ou est-ce une impasse? Si oui, je peux juste finir par utiliser OAuth à la place.

Un grand merci d'avance pour toute idée que vous pouvez offrir!

Shane

static class MyAuthenticator extends Authenticator { 

    private String username, password; 

    public MyAuthenticator(String user, String pass) { 
     username = user; 
     password = pass; 
    } 

    protected PasswordAuthentication getPasswordAuthentication() { 
     System.out.println("Requesting Host : " + getRequestingHost()); 
     System.out.println("Requesting Scheme : " + getRequestingScheme()); 
     System.out.println("Requesting Site : " + getRequestingSite()); 
     return new PasswordAuthentication(username, password.toCharArray()); 
    } 
} 

bip public void (AutoTwitterAccount acc, bip String) { Authenticator.setDefault (null);

Authenticator.setDefault(new MyAuthenticator(acc.getUserName(), acc.getPassword())); 
    try { 
     /* First login the session and fire off tweet*/ 
     URL url = new URL(AutoTweeter.TWEET_URL); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoOutput(true); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("User-Agent", "Mozilla/4.0"); 
     conn.setRequestProperty("User-Agent", AGENT); 
     conn.setRequestProperty("Content-Type", TYPE); 
     conn.setRequestProperty("Content-Length", "" + tweet.length()); 
       ...fire off tweet.... 
     conn.disconnect(); 

Merci encore une fois!

+0

http://www.cafesoft.com/products/cams/tomcat-security.html (où il est dit « Une fois que vous entrez .. ") – Bozho

Répondre

4

Si l'Authenticator ne fait pas appelée à nouveau (et même le remettre à zéro à un autre ne fonctionne pas, ce qui est apparemment le cas en raison de a bug), vous pouvez renoncer à Authenticator et send the HTTP Basic Auth header manually:

URL url = new URL("http://www.example.com/comment"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestProperty("Authorization:", 
"Basic "+codec.encodeBase64String(("username:password").getBytes()); 
+0

Merci Thilo, ça ressemble à l'argent! Je vais essayer ça dès que je le peux. – user259121

0

J'ai essayé mais cela ne m'authentifierait toujours pas, mais j'ai contourné ceci en utilisant une classe utilitaire de co-workers pour construire la requête HTTP moi-même et l'écrire directement sur le socket, sans passer par les classes Http de Sun. Mais merci pour votre réponse de toute façon!

0

Si vous utilisez Authenticator pour un proxy, essayez ce qui suit:

import org.apache.commons.codec.binary.Base64; 
... 
StringBuilder auth = new StringBuilder("Basic "); 
auth.append(Base64.encodeBase64String((username + ':' + password).getBytes())); 
connection.setRequestProperty("Proxy-Authorization", auth.toString()); 
Questions connexes