Java ist auch eine Insel

Dienstag, August 28, 2007

Inselupdate: Passwort-geschützte Seiten mit Basic Authentication/Proxy-Authentifizierung

URL-Verbindungen können durch die Basic Authentication, also durch ein Passwort, geschützt sein. Anwender bemerken dies, wenn sich ein Eingabedialog öffnet, der die Eingabe eines Namens und eines Passworts erzwingt. Die Webseite http://www.rahul.net/joeuser/ demonstriert diesen Eingabedialog. Der Benutzername »joeuser« und das Passwort »a.b.C.D« zeigen eine Webseite erst nach der Identifizierung.

Ohne das Login kommt auch ein Java-Programm nicht an die Seite. Daher muss der Java-Client der Authentifizierungsbitte nachkommen, und Benutzername und Passwort schicken. Glücklicherweise geht das in Java mit der Klasse java.net.Authenticator ganz einfach:



Authenticator.setDefault( new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
System.out.printf( "url=%s, host=%s, ip=%s, port=%s%n",
getRequestingURL(), getRequestingHost(),
getRequestingSite(), getRequestingPort() );

return new PasswordAuthentication( "joeuser", "a.b.C.D".toCharArray() );
}
} );

URL url = new URL( "http://www.rahul.net/joeuser/" );
System.out.println( new Scanner( url.openStream() ).useDelimiter( "\\Z" ).next() );

Die Anweisung Authenticator.setDefault() setzt einen neuen Authenticator, den die URL-Klasse immer dann nutzt, wenn eine Verbindung aufgebaut wird. Dann ruft die Java-Bibliothek unsere überschriebene Funktion getPasswordAuthentication() auf, in der wir ein PasswordAuthentication-Objekt liefert, welches die Benutzernamen und Passwort kodiert. Da getPasswordAuthentication() eine überschriebene Methode ist, kann sie über diverse getXXX()-Methoden auf Zustände zurückgreifen, und das sind die Verbindungsdaten wie Host, usw. Diese Daten sind nicht unwichtig, denn wir wollen ja mitunter für unterschiedliche Webseiten unterschiedliche Benutzer und Passwörter verwenden wollen.

Proxy-Authorization

Um nicht nur eine Benutzer-Authentifizierung, sondern auch eine Authentifizierung für den Proxy zu realisieren gibt es zwei Möglichkeiten.

System.setProperty( "http.proxyUserName", proxyUser );
System.setProperty( "http.proxyPassword", proxyPass );

Eine andere Variante ist, die Header-Variable „Proxy-Authorization“ zu setzen:

URLConnection conn = url.openConnection();
String base64 = "Basic " + new sun.misc.BASE64Encoder().encode((user + ":" + passwd).getBytes() );
conn.setRequestProperty( "Proxy-Authorization", "Basic " +
new sun.misc.BASE64Encoder().encode((proxyUser + ":" + proxyPass).getBytes()) );
conn.connect();
InputStream in = conn.getInputStream();

Labels:

AddThis Social Bookmark Button