Java Webseiten Login mittels HttpClient

Danny787

Ensign
Registriert
Jan. 2007
Beiträge
180
Hallo liebe Community!

Wie im Titel schon erwähnt versuche ich mittels HttpClient einen Webseiten Login hinzubekommen um anschließend auf bestimmte Inhalte zugreifen zu können.
Hier erstmal mein Ansatz:

Code:
public class LoginSample {
        public static final String USER_NAME = "Hier kommt der Benutzername rein";
	public static final String USER_PASSWORD = "Hier kommt das Passwort rein";
	public static final String URL = "Hier kommt die URL rein";

	public static void main(String[] args) {
		HttpClient httpclient = new DefaultHttpClient();
		HttpPost httppost = new HttpPost(URL);

		try {
			List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
			nameValuePairs.add(new BasicNameValuePair("username",
					USER_NAME));
			nameValuePairs.add(new BasicNameValuePair("password",
					USER_PASSWORD));

			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

			HttpResponse response = httpclient.execute(httppost);
			BufferedReader rd = new BufferedReader(new InputStreamReader(
					response.getEntity().getContent()));
			String line = "";
			while ((line = rd.readLine()) != null) {
				 System.out.println(line);
			}

			}

		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
		} catch (IOException e) {
			// TODO Auto-generated catch block
		}
	}

}

Hier noch der relevante Part des Seitenquelltext der Webseite, auf welcher der Login durchgeführt werden soll:

Code:
	               <!-- Benutzername und Passwort -->
                 <tr valign="top">
                     <td class="normal" valign="middle">
                         <label for="Benutzername">&nbsp;&nbsp;&nbsp;Benutzername:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
                     </td>

                     <td class="normal" align="left">
                         <input id="Benutzername" type="text" name="username" value="" class="loginuser" size="13" tabindex="1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                         <script language="Javascript">document.loginform.username.focus();</script>
                     </td>
                 </tr>
                 <tr>
                     <td class="normal" valign="middle">
                         <label for="pass">&nbsp;&nbsp;&nbsp;Passwort:&nbsp;&nbsp;&nbsp;</label>

                     </td>
                     <td class="normal" valign="middle" align="left">
                         <input type="password" id="pass" name="password" value="" class="loginpass" size="13" tabindex="2">
                     </td>
                 </tr>
				 <tr><td></td></tr>
				 <tr>
                     <td class="normal">
					 </td>

                     <td class="normal" align="left">
                       <input class="submit" type="submit" name="submit" value="Anmelden" tabindex="7">
                     </td>
				 </tr>
				 
              <!-- /Benutzername und Passwort -->

Hier noch der Yahoo Seitenquelltext falls das irgenwie hilft:
Code:
<label for='username'>Yahoo!-ID</label>

				                    	<input name='login' id='username' maxlength='96' tabindex='1' value=''>

                    	<p id='ex'>(z. B. free2rhyme@yahoo.com)</p>
					
                    <label for='passwd'>Passwort</label>
                    <input name='passwd' id='passwd' type='password' maxlength='64' tabindex='2'>



Der Login funktioniert leider noch nicht und ich weiß einfach nicht woran es liegen könnte. Komischerweise kann ich mich hingegen bei Yahoo problemlos einloggen und auf die Inhalte zugreifen, nur eben noch nicht auf der besagten Seite.

Weiß vielleich Jemand wo der Fehler liegen könnte?
Danke schon mal in voraus :)
 
Zuletzt bearbeitet:
Fliegt dir da eine Exception oder so?

Meldest du dich sowohl bei yahoo als auch auf deiner Seite über HTTPS an?

Welche Unterschiede gibt es zwischen den beiden Seiten?
 
schickst du den request denn auch an die auswertende seite oder an die, die das formular enthält?

Ne genau Fehler beschreibung wäre ganz hilfreich:)
 
Nein es fliegt keine Exception, ich bekomme lediglich den kompletten Seitenquelltext der Login-Seite auf der Konsole ausgegeben.
Wenn ich dann anschließend versuche eine neue (nur nach einem Login erreichbare) URL mit einem Inputstream auszulesen, dann bekomme ich erneut nur den Seitenquelltext des Loginbereichs ausgegeben, bei Yahoo hingegen die gesicherten Inhalte.

Sowohl Yahoo als auch besagte Seite verwenden https
 
Zuletzt bearbeitet:
Danny787 schrieb:
Nein es fliegt keine Exception, ich bekomme lediglich den kompletten Seitenquelltext der Login-Seite auf der Konsole ausgegeben.

Dann ist der Login misslungen. Eventuell eine Fehlermeldung seitens der Seite vorhanden? Ansonsten gibt es da eben doch noch eine Sache die du "falsch"machst.

Wir wissen natürlich nicht, wie Yahoo seine Anwendung technisch umgesetzt hat, aber ich würde wenigstens mal versuchen mich als Browser auszugeben, also alle Header mitsenden, die auch ein Browser sendet. So erkennt man dich sofort als Bot, was ggf. geblockt wird.
 
also mich wundert es nicht das du den inhalt der login seite zu sehen bekommst, dein Request verlangt ja auch nach nichts anderem.
Du musst mal schauen wohin das Formular der Seite geschickt wird, nachdem man auf Login geklickt hat und deinen request an diese Seite schicken.

Ansonsten musst du von deinem Programm die Felder username und passwort ausfüllen lassen und einen klick auf "Login" oder was auch immer simulieren, was aber ein ganz erheblicher aufwand wäre

oder schickt dein programm das formular ab? Kenne mich damit nicht so aus aber sieht für mich nicht danach aus
 
oder schickt dein programm das formular ab? Kenne mich damit nicht so aus aber sieht für mich nicht danach aus

Wenn mich nicht alles täuscht, dann sollte dies der Fall sein. Bei Yahoo funktioniert es ja auch auf diese Weise

Mit folgenden Zeilen werden die Post Parameter definiert:

Code:
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
			nameValuePairs.add(new BasicNameValuePair("username",
					USER_NAME));
			nameValuePairs.add(new BasicNameValuePair("password",
					USER_PASSWORD));

			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

Und hier wird dann der Request ausgeführt:

Code:
HttpResponse response = httpclient.execute(httppost);
 
vlt. wird der login dortmit JS realisiert?
Ich z.b. verhindere oft das normale submit eines formulares und mache das anschließend mit JavaScript.
Das müsste dein programm dann ja ebenfalls noch mit ausführen, ist zumindest eine idee ^^

aber wieso schickste nicht direkt nen HTTP request an die Seite die den Login verifiziert?
Bei yahoo könnte es sein das die selbe seite zum auswerten wie zum anzeigen genommen wird und es deswegen klappt.


edit:
habs gerade geprüft, das ist in der tat der fall.

die url der login seite bei yahoo ist https://login.yahoo.com/config/login

und das formular wird geschickt an.......
https://login.yahoo.com/config/login

;)

ich denke das dein code POST daten erzeugt, dem haeder beifügt und dann alles absendet.
das problem ist aber auch das viele einfache seiten das senden eines formulares prüfen mit
PHP:
if(isset($_POST['submit'])) {}
weiß nicht wie es bei deiner seite aussieht, müsstest du dann ggf. auch noch mitsenden
 
Zuletzt bearbeitet:
sry wegen doppel post, aber lies mal meine edits ;)

nochmal ein edit:

wieso schreibst du dir nicht selber kurz 4 seiten zum testen?

eine könnte so aussehen:

PHP:
print_r($_POST);
print_r($_GET);

damit kannst du dann testen was für daten per post und get übertragen wurden.
Wenn jetzt in $_POST username und passwort auftauchen sendet dein programm keine fornulare ab, sondern erzeugt eine HTTPPost anfrage.

die zweite müsste ein kurzes fornular und die gleichzeitige auswertung enthalten

3 & 4 sind ein zusammenschluss aus 1 & 2.

Seite 3 enthält das formular und sendet es an seite 4, die aber nur den inhalt aus seite 1 enthält
 
Zuletzt bearbeitet:
Hab nun der Request an die Seite geschickt, die den Login verifiziert, bekomme nun jedoch eine java.lang.Exception geschmissen:

Im Modul User ist ein Fehler aufgetreten: java.lang.Exception
 
mehr steht da nicht? Ist ja keine sehr aussagekräftige exception. Um welche seite genau geht es denn?
 
benuzt du diese seite als URL?
http://www.hs-weingarten.de/web/wil...saveLastPath=0&_58_struts_action=/login/login

ich muss jetzt leider gleich weg, google mal nach der exception (ohne dem datum ntürlich) und guck mal was da findest.

Das Formular hat jedenfalls einige versteckte felder und auch die action URL ist sehr lang. Kann gut sein das die versuchen solche logins zu vermeiden, das müsste man jetzt stück für stück auseinander nehmen.
 
Ok vielen Dank für deine Mühe!
Ich werd nun mal noch bissel rumprobieren, notfalls frag ich einfach mal im Rechenzentrum nach :)
 
ich habe jetzt, weil du mein interesse geweckt hast, mir mal den gesamtenlogin vorgang angeschaut.

ich habe eine Grafik angehängt, das ist ein auszug auf dem Chrome debugger.

da sieht man z.b. das die felder nicht username und passwort heißen sonden
"_58_login" und "_58_password"
wobei ich fast glaube das die namen generiert werden.....

außerdem werden noch 2 weitere felder per post gesendet, "_58_redirect" und "_58_rememberMe"

die solltest du auch noch mitschicken.

dir url an die geschickt wird ist folgende:

http://www.hs-weingarten.de/web/wil...saveLastPath=0&_58_struts_action=/login/login

ich hab mal versucht die ganzen url parameter zu entfernen, aber dann komme ich immer wieder auf die startseite....

ich glaube ein ganz wichtiger URL parameter ist "_58_struts_action" der de wert "/login/login" einnehmen muss

zusätzlich wird noch eine sessionid mit übertragen.

und wenn die ganz schlau sind prüfen die sogar den ursprung des requests, ich würde fast davon ausgehen das die so etwas, wie du vorhast, unter allen umständen vermeiden wollen.

ansonsten kannst du mal versuchen den request so genau wie möglich nach zu bauen.

ich weiß nicht in wie weit die Java Implementierung das erlaubt, den header zu modifizieren und so, ggf. musst du halt per socket selber eine Anfrage schicken und den header selber zusammen basteln.
 

Anhänge

  • hs.png
    hs.png
    176,6 KB · Aufrufe: 292
Zurück
Oben