Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy Login+Cookies (https://www.delphipraxis.net/160064-indy-login-cookies.html)

-187- 26. Apr 2011 10:26

Indy Login+Cookies
 
Moin ;)

Ich versuch mich grad via Indy in meinem CMS einzuloggen jedoch ist es garnicht so einfach wie ich es mir erhofft habe :)
Meine Basis Idee um zu prüfen ob der Login funktioniert war wie folgt:

Delphi-Quellcode:
HTTP.Post(loginURL,loginParameter);
sl.Text:=HTTP.Get(startURL);
if Pos('logout',sl.text)>0 then ShowMessage('logged in');
Funktioniert nicht -> Das CMS speichert die login daten ausschließlich in Cookies -> kein Zurgriff über PHP Session ID's. Folglich habe ich meinen Code um folgende Zeilen ergänzt:

Delphi-Quellcode:
HTTP.CookieManager:=IdCookieManager1;
Mist! Klappt ja immernoch nicht :( ..Weiter geht's: Erstmal die Cookie Items auslesen...

Ergebnis:
Code:
mnm_user=Username668; path=/; domain=.meine-domain.com
mnm_key=QnJlc2xpbjY2ODoyMnJLR2IyRWdoempFOjQxN2QzYWRjZmU5MjVlNGZkYmRhZDhiZDQxNzAwNzNj; path=/; domain=.meine-domain.com
PHPSESSID=43659b7222a1f5217b496606717d67bb; path=/; domain=www.meine-domain.com;
Die Frage ist jetzt, wie kann meinem HTTP.Get Befehl den Cookie String anhängen, denn das wäre jetzt mein nächster Versuch... Oder habt ihr noch eine bessere Idee? ;)

-187-

shmia 26. Apr 2011 11:05

AW: Indy Login+Cookies
 
Zitat:

Zitat von -187- (Beitrag 1096965)
via Indy in meinem CMS einzuloggen

Bevor du weitermachst solltest du prüfen, ob du mit einem Browser deiner Wahl und abgeschaltetem Java-Script deine gewünschte Aufgabe überhaupt erledigen kannst.
Indy hat keine Unterstützung für Java-Script; viele Webseiten stützen sich aber stark darauf und können ohne nicht arbeiten.

Zacherl 26. Apr 2011 11:12

AW: Indy Login+Cookies
 
Einloggen mache ich meistens über den dafür vorgesehen Weg: Das Login Formular der Seite :D

Erstmal den Quelltext ansehen und gucken, welche Felder ausgefüllt werden müssen (Username, Password, eventuell weitere IDs, etc.), danach einen entsprechenden Header prepärieren und mit IdHTTP.Post() auf die Reiste schicken. Wenn du AllowCookies auf true gesetzt hast, sollte dann deine Session auch zumindest bis zum Schließen des Programms aufrecht erhalten bleiben.

-187- 26. Apr 2011 11:42

AW: Indy Login+Cookies
 
Zitat:

Zitat von shmia (Beitrag 1096972)
Zitat:

Zitat von -187- (Beitrag 1096965)
via Indy in meinem CMS einzuloggen

Bevor du weitermachst solltest du prüfen, ob du mit einem Browser deiner Wahl und abgeschaltetem Java-Script deine gewünschte Aufgabe überhaupt erledigen kannst.
Indy hat keine Unterstützung für Java-Script; viele Webseiten stützen sich aber stark darauf und können ohne nicht arbeiten.

Klappt auch ohne JS !

Zitat:

Zitat von Zacherl (Beitrag 1096974)
Einloggen mache ich meistens über den dafür vorgesehen Weg: Das Login Formular der Seite :D

Erstmal den Quelltext ansehen und gucken, welche Felder ausgefüllt werden müssen (Username, Password, eventuell weitere IDs, etc.), danach einen entsprechenden Header prepärieren und mit IdHTTP.Post() auf die Reiste schicken. Wenn du AllowCookies auf true gesetzt hast, sollte dann deine Session auch zumindest bis zum Schließen des Programms aufrecht erhalten bleiben.

Das ist nicht das Problem. Ich bin mir sicher das ich alle Post Werte mitschicken. Habe mir vorher via Wireshark angeschaut was ich brauche...

Der Login an sich klappt auch, das weiss ich daher weil man nach dem Login redirected wird. Das habe ich im OnRedirect geprüft. (Login fehlerhaft = kein Redirect, Login Ok = Redirect (Die redirected URL ist jedoch nicht mit einer SID oder ähnlichen versehen, man wird nur ins "root" weiterschickt))

Das Problem ist das die Session nicht erhalten bleibt.

//Edit:

Ich hab mir jetzt mal die Cookies angeschaut die Firefox erstellt. Da gibt es noch zwei weitere Felder: "Expires" und "Secure" ... Kann es damit zusammenhängen ?

//Edit2:

Hier liefer ich euch nochmal die RawHeaders:

Code:
Date: Tue, 26 Apr 2011 12:12:41 GMT
Server: LiteSpeed
Connection: close
X-Powered-By: PHP/5.2.17
Set-Cookie: PHPSESSID=ca753b5f460588c3e9ac1174beae51b0; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html

viper3001 26. Apr 2011 13:21

AW: Indy Login+Cookies
 
Also ich hatte mal so ein ähnliches Problem.
Versuch mal Folgendes: Die seite zuerst mit get aufrufen. Da schau dir mal das RecvPacket an. Bei dir stand genau drin Set-Cookie: PHPSESSID=ca753b5f460588c3e9ac1174beae51b0; path=/

->
Code:
temp_sh:='PHPSESSID=ca753b5f460588c3e9ac1174beae51b0';
HTTP.AllowCookies:=true;
HTTP.Cookiemanager.addCookie(temp_sh,loginURL);
Hoffe es hilft evtl.

MfG

-187- 26. Apr 2011 14:17

AW: Indy Login+Cookies
 
Zitat:

Zitat von viper3001 (Beitrag 1097010)
Code:
temp_sh:='PHPSESSID=ca753b5f460588c3e9ac1174beae51b0';
HTTP.AllowCookies:=true;
HTTP.Cookiemanager.addCookie(temp_sh,loginURL);

Mein IdCookieManager kennt kein AddCookie sondern nur AddCookies. Da ist aber kein String erlaubt:
IdCookieManager1.AddCookies(Cookie,'domain.com');
E2010 Inkompatible Typen: 'TIdCookieManager' und 'string'

Edit, ok so funktioniert das:
Code:
      cookieURL:=TIdURI.Create('http://www.domain.com/');
      HTTP.CookieManager.AddServerCookie(Cookie,cookieURL);
Melde mich gleich wieder obs mich weiter bringt :)

Edit, Nein..hat mich noch nicht weiter gebracht :/

viper3001 26. Apr 2011 14:36

AW: Indy Login+Cookies
 
ich editiere mal kurz meinen quelltext rein mom.

Code:
procedure TForm1.Button1Click(Sender: TObject);
var uri:TidUri;
temp_sh,url:String;
begin
HTTP.CookieManager:=IdCookieManager1;
HTTP.AllowCookies:=true;
HTTP.CookieManager.GenerateCookieList(uri);
HTTP.CookieManager.addCookie(temp_sh,url);
end;
so müsste das normal funktionieren. temp_sh kannste aus dem RecvPacket vom http.get(url) rausfiltern da stand ja schon setCookie: usw...
und die url wird halt mit eingetragen. Danach kannste dann http.post(); mit den daten machen.

Achja benutzte indy10 kA ob das da nen unterschied macht.

MfG

-187- 26. Apr 2011 14:48

AW: Indy Login+Cookies
 
Hmm ich benutzte auch Indy 10 (10.5.7) und da gibt es kein AddCookie()...

Du hast da scheinbar auch was anderes gemacht. Ich möchte zuerst den Login posten und dann die HTML Seite runterladen.

1. Log-In Paramter senden: HTTP.Post('http://www.my-domain.com/login.php',lParams);
2. "Logged In" HTML Seite runterladen: ResponseCode.Text:=HTTP.Get('http://www.my-domain.com/');


Delphi-Quellcode:
begin
  HTTP:=TIdHTTP.Create(nil);
  HTTP.AllowCookies:=True;
  HTTP.CookieManager:=IdCookieManager1;
  lParams:=TStringList.Create;
  ResponseCode:=TStringList.Create;
  try
    try
      lParams.Values['username']:='Username';
      lParams.Values['password']:='Password';
      lParams.Values['submit']:='Login';
      HTTP.Post('http://www.my-domain.com/login.php',lParams);

      Cookie:=HTTP.Response.RawHeaders.Values['Set-Cookie'];
      Cookie:=Copy(Cookie,1,Pos(';',Cookie)-1);
      cookieURL:=TIdURI.Create('www.my-domain.com');
      HTTP.CookieManager.AddServerCookie(Cookie,cookieURL);

      ResponseCode.Text:=HTTP.Get('http://www.my-domain.com/');
      Memo1.Text:=ResponseCode.Text;
    except
      on Exception do
        ShowMessage('Fehler..');
    end;
//Edit, macht auch eigentlich kein Sinn den Cookie nochmals in den Manager einzufügen. Die Ausgabe hat gezeigt das der Cookie bereits vorhanden ist.

viper3001 26. Apr 2011 15:18

AW: Indy Login+Cookies
 
hmm schade dann weiß ich momentan auch nicht weiter sry =) müsste es evtl direkt an der page noch probieren sonst kA.

geskill 26. Apr 2011 19:24

AW: Indy Login+Cookies
 
Huhu,
die Cookies wurden von einigen Wochen komplett überarbeitet/vereinfacht und sind nun viel alltagstauglicher, deswegen empfehle ich dir erstmal dringend ein Indy Update.

Dateien:
http://indy.fulgan.com/ZIP/

Anleitung (thx @ Apfelteig):
http://www.herrotto.de/delphiindy/

Grüße

PS: Mit WireShark kannst du prima deinen kompletten Datenverkehr überwachen, hat mir schon unzählige male geholfen den Fehler zu finden.

PPS: Für die Parameterliste empfehle ich dir TStringStream oder TIdMultiPartFormDataStream

PPPS: Wenn du eine Abfrage sendest nimm bitte immer TStringStream um an die Antwort zu kommen á la:
Delphi-Quellcode:
ReplyData := TStringStream.Create('', CP_UTF8); // wenn Webseite in utf-8 kodiert ist
try
  Get('http://www.deinewebseite.com/', ReplyData);
finally
  ReplyData.Free;
end;
Weil Indy wandelt, wenn du dort String's benutzt gzip kodierte Daten nicht automatisch um und bei normalen String's und utf-8 kodierten Seiten kommen u.a. die Umlaute falsch rüber.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz