Login: Cookie fehlt

thomy800

Erfahrenes Mitglied
Hallo.
Ich habe ein Programm geschrieben, was sich auf einer Seite einloggen soll. Beim Einloggen wird vom Server ein Cookie, die Session-ID, gesendet. Das Problem dabei ist, dass, wenn mein Programm sich einloggt, keine Session-ID ankommt. Wenn ich falsche Daten (also falscher Benutzername & Passwort) sende, dann bekomme ich auch eine entsprechende Fehlermeldeung (als HTML), also geh ich davon aus, dass die Daten richtig ankommen. Nur wenn ich die richtigen sende, empfange ich immer wieder die Loginseite, aber keinen Cookie.
Folgenden Header empfange ich:

Code:
HTTP/1.1 200 OK
Date: Sun, 17 Apr 2011 16:54:44 GMT
Server: Apache/2.2.3 (Scientific Linux)
Content-Length: 1356
Cache-Control: max-age=2592000
Expires: Tue, 17 May 2011 16:54:44 GMT
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

Hat jemand eine Idee, woran das liegen könnte?

Grüße,
Thomy

PS: das läuft über HTTPS. Ich verwende einen TrustManager und einen HostnameVerifier der alle Zertifikate akzeptiert.
 
Hab ich gerade getestet, hat aber leider nix geändert. Hab sogar komplett den Header von Firefox abgeschickt (also per setRequestProperty(...)).
Übrigens, folgenden Header sollte ich eigentlich empfangen:
Code:
HTTP/1.1 302 Found           <===
Date: Mon, 18 Apr 2011 17:27:24 GMT
Server: Apache/2.2.3 (Scientific Linux)
Cache-Control: no-cache, max-age=2592000
Content-Length: 110                <===
Set-Cookie: session=***; path=/; expires=Mon, 18-Apr-2011 19:27:24 GMT; HttpOnly <===
Location: ***                          <===
Expires: Wed, 18 May 2011 17:27:24 GMT
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
 
Zuletzt bearbeitet:
Wie wäre es wenn du uns mal den REQUEST zeigst ?
Einmal den den du machst und dann mal den den FF macht ...
Ich denke doch das es da gehörige Unterschiede gibt die das Fehlverhalten erklären.
Weil du musst dem Server ja auch die Login-Daten schicken ... wenn du das nicht tust is klar das der Server dir nur die Login-Seite sendet und kein erfolgreiches LOGIN OK.
Du könntest uns auch n Link der Seite schicken das sich das mal eine von uns angucken kann und dir eventuell n funktionierenden Request zusammen bauen.
Auch wäre etwas Source nicht schlecht daimt wir darin enthaltene Fehler erkennen können.
Ein einfaches : GEHT NICHT hilft hier nicht weiter ... denn woher sollen wir wissen WARUM es so ist wenn wir weder wissen was der Server als gültigen Request verlangt noch was du ihm schickst.
 
Kann ich den (kompletten) ausgehenden Stream irgendwie abfangen, damit ich den hier mal posten kann?
Im Anhang hab ich mal das komplette von mir erstellte package angehängt. Verwendet wird es wie folgt:
Java:
public static void login() throws MalformedURLException, IOException{
		Page start=new Page(new URL("www.host.de/login"));
		start.submit();
		start.printHeader();
		
		Form f=new Form();
		f.setRequestMethod("POST");
		f.addInput(new Submit());
		f.addInput(new Textfield("password", "****"));
		f.addInput(new Textfield("accountname", "****"));
		Page p=start.getNextPage();
		p.setForm(f);
		p.submit();
		p.saveContent("/result.htm");
		p.printHeader();
	}
Das Ding ist auch in der Lage Dateien hochzuladen. Die erste start-Seite ist nur wegen dem Referrer drin.
Wie gesagt: der Post sollte eigentlich korrekt sein. Ich habe mir auch selber nen Test-Server mittels PHP geschrieben, wo alle Daten wie erwartet ankommen.
PHP:
	echo "some data:<br>\n";
	echo "<br>\n get ";
	print_r($_GET);
	echo "<br>\n post ";
	print_r($_POST);
	echo "<br>\n files ";
	print_r($_FILES);
	echo "<br>\n cookies ";
	print_r($_COOKIE);
	echo "<br>\n";

Grüße,
Thomy
 

Anhänge

Zuletzt bearbeitet:
schonmal die seite im browser aufgerufen ?

erstens kommt eine warnmeldung das das zertifikat ungültig ist *zertifikat ist auf eine andere domain ausgestellt* ...
und zweitens kommt auf https://www.ifh.de/cecdb/login ein HTTP404 vom server ... FILE NOT FOUND

außerdem : was zur hölle hast du dir hier zusammengeschrieben ? ... du hast das rad echt neu erfunden ... google mal nach apache commons oder arbeite dierekt mit plain-sockets ... aber diesen code versteht kein mensch ...

und nochmal : wie muss der zu sendene header aussehen ?
 
schonmal die seite im browser aufgerufen ?
Ja.

erstens kommt eine warnmeldung das das zertifikat ungültig ist *zertifikat ist auf eine andere domain ausgestellt* ...
thomy800 hat gesagt.:
PS: das läuft über HTTPS. Ich verwende einen TrustManager und einen HostnameVerifier der alle Zertifikate akzeptiert.

und zweitens kommt auf ein HTTP404 vom server ... FILE NOT FOUND
Bei mir nicht:
thomy800 hat gesagt.:

außerdem : was zur hölle hast du dir hier zusammengeschrieben ? ... du hast das rad echt neu erfunden ... google mal nach apache commons
Wenn ich mich recht erinner, hatte ich irgendwo gelesen, dass das was für Server sei..

oder arbeite dierekt mit plain-sockets ...
Hatte ich auch versucht, aber da hatte ich sehr merkwürdige Fehler wegen SSL etc.

aber diesen code versteht kein mensch ...
Der Code ist meiner Meinung nach sehr strukturiert. Abgesehen davon, dass es nur wenig Kommentare gibt (da der Code ja nicht für die Öffentlichkeit gedacht war),weiß ich nicht, was es da nicht zu verstehen gibt.

und nochmal : wie muss der zu sendene header aussehen ?
Mein FF zeigt folgendes an:
Code:
POST /login HTTP/1.1
Host: www.ifh.de
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20100101 Firefox/4.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: /login
(vorrausgesetzt, der verheimlicht nicht irgendwelche Infos)

Grüße
Thomy
 
Zuletzt bearbeitet:
-.-'
Ich meine den Header der entsteht wenn du dich Einloggst.
Weil in dem was du da gepostet hast fehlen

Content-Type
Content-Length
und die POST-Daten

Ist klar das der Server mit ner normalen 200 Antwortet wenn du ihm keine Daten mit sendest.
Und nein : dein Code ist nicht einfach ... du erfindest nur das Rad neu.
Ich mein : wo bitte ist es denn so schwierig einen Socket aufzubauen, einen SSL-Handler drüber zu legen und dann darüber plain die Daten zu senden ?

Pseudo-Code
Java:
Socket sock=new Socket(HOST, 443);
SSLHandler handler=new SSLHandler(sock);
PrintStream out=new PrintStream(handler.getOutputStream());
BufferedReader in=new BufferedReader(new InputStreamReader(handler.getInputStream()));
String postData="username=USER&password=PASS";
out.println("POST https://www.ifh.de/cecdb/login HTTP/1.0");
out.println("Server: www.ifh.de");
out.println("Content-Type: application/x-www-form-urlencoded");
out.println("Content-Length: "+postData.length());
out.println("");
out.println(postData);
out.println("");
//von in lesen ...
//closen
Der SSLHandler muss dann nur die Umsetung der plain-Daten in SSL implementieren und Input- und OutputStream über getter zur verfügung stellen (natürlich den Zertifikats-Handler nich vergessen).
Was du da rum gebastelt hast mag zwar für dich toll aussehen, ist aber so ohne Doc oder Comments schwer nachvollziehbar.
Und ich mein : erlich ... für das was du dir da rumgebaut hast einfach die Apache Commons zu nehmen tu dem kein abbruch (Apache-HTTP-Commons kann man als Server oder Client einsetzen ... also vorher mal GOOGLEN bevor man dumm antwortet).


Und jetzt nochmal für ganz dumme : google dir n Sniffer der SSL-fähig is *also so das du die daten PLAIN lesen kannst* und kugg dir dann mal genau an was dein FF sendet ...
Gut .. so n Müll wie User-Agent, Referer oder die ganzen Accepts kannst du weglassen weil das alles HTTP/1.1 standard is ... wenn du sowas selbst machst empfehle ich dir ads simplere HTTP/1.0 ...
 
Hallo,

Ich habe bei http://commons.apache.org/net/api-release/index.html geguckt, aber weder SSL noch HTTPS finden können. Ich habe auch die Klasse SSLHandler gegoogelt, aber ebenfalls nichts gefunden. Hast du die selber geschrieben? Wenn ja, das wäre doch gerade der interessante Teil vom Code... Auch Googlen nach Plain-Socket hat keinen Erfolg gebracht (ist das Java?). Ich habe nun auch nen Snifer mitlaufen lassen, aber der hat mir auch nicht mehr Informationen gegeben, als ich vorher schon hatte.
Wenn du dir meinen Quelltext länger als nur 2 min angesehen hättest, hättest du gesehen, dass ich auch den Post (der übrigens NICHT zum Header gehört!) selbst sende (siehe Form.submit()).
Hier der Mitschnitt:
Code:
Request:

POST /login HTTP/1.1
Host: www.host.de
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20100101 Firefox/4.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: login
Content-Type: application/x-www-form-urlencoded
Content-Length: 49

accountname=*NAME*&passwort=*PASS*&submit=Submit

Antwort:

HTTP/1.1 302 Found
Date: Mon, 18 Apr 2011 17:27:24 GMT
Server: Apache/2.2.3 (Scientific Linux)
Cache-Control: no-cache, max-age=2592000
Content-Length: 110
Set-Cookie: session=***; path=/; expires=Mon, 18-Apr-2011 19:27:24 GMT; HttpOnly <===
Location: ***
Expires: Sat, 21 May 2011 17:27:24 GMT
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

<html><body><p>This item has moved <a href=" ... </html>

Woraufhin FF dem Location folgt:

GET history/list HTTP/1.1
Host: www.host.de
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20100101 Firefox/4.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: login
Content-Type: application/x-www-form-urlencoded
Cookie: session=***

Worauf der Server mit 200 antwortet.

Wo wir wieder am Anfang angelangt wären: den ersteren Header & Inhalt schicke ich genau so mit HTTP(S)UrlConnection ab, erhalte aber im Gegensatz zu FF eine andere Antwort des Servers.
Ich werd mal versuchen, die Übertragung von meinem Programm zu sniffen...

Grüße
Thomy
 
Zuletzt bearbeitet:
1) SSLHandler war PSEUDO ... ich hab doch unten drunter geschrieben das du diese selbst implementieren musst und schematisch beschrieben was rein gehört.
2) Ein Plain-Socket ist ein stink normaler Socket über den halt alles PLAIN, also im KLARTEXT, läuft. Um dorthin zu kommen muss deine SSL-Verbindung einer Klasse *dem genannten SSLHandler* übergeben werden der sich um den ganzen krypto-Kram kümmert und dir dann einen Plain-Socket zur verfügung stellt ...
3) Wenn du den Request den FF sendet genau so selbst sendest ist entweder n kleiner Fehler drin *z.B. falsche Content-Length oder das am Ende fehlende \r\n\r\n *doppelter Zeilenumbruch um zu signalisieren das dein Request beendet ist* oder du sendest was anderes.
4) Was Apache Commons angeht : ich kenne dieses Framework nicht dierekt sondern nur vom Hören-Sagen da ich alles was ich bis jetzt mit HTTP am Hut hatte eben so wie oben beschrieben alles mit Plain-Sockets gemacht hab. Das ich in der Doc noch nich mal den normalen HTTPClient finde von dem immer alle reden is relativ nebensächlich da ichs wie gesagt nicht näher kenne.
5) Googlen nach Plain-Sockets und Java hat dir nich das gebracht was du suchst ? Liegt vielleicht daran das du dir zum Zeitpunkt der Suche nicht über die Bedeutung im klaren warst und daher vermutlich was anderes erwartet hast als es eigentlich ist.
 
Zurück