![]() |
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:
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:
HTTP.Post(loginURL,loginParameter);
sl.Text:=HTTP.Get(startURL); if Pos('logout',sl.text)>0 then ShowMessage('logged in');
Delphi-Quellcode:
Mist! Klappt ja immernoch nicht :( ..Weiter geht's: Erstmal die Cookie Items auslesen...
HTTP.CookieManager:=IdCookieManager1;
Ergebnis:
Code:
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? ;)
mnm_user=Username668; path=/; domain=.meine-domain.com
mnm_key=QnJlc2xpbjY2ODoyMnJLR2IyRWdoempFOjQxN2QzYWRjZmU5MjVlNGZkYmRhZDhiZDQxNzAwNzNj; path=/; domain=.meine-domain.com PHPSESSID=43659b7222a1f5217b496606717d67bb; path=/; domain=www.meine-domain.com; -187- |
AW: Indy Login+Cookies
Zitat:
Indy hat keine Unterstützung für Java-Script; viele Webseiten stützen sich aber stark darauf und können ohne nicht arbeiten. |
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. |
AW: Indy Login+Cookies
Zitat:
Zitat:
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 |
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:
Hoffe es hilft evtl.
temp_sh:='PHPSESSID=ca753b5f460588c3e9ac1174beae51b0';
HTTP.AllowCookies:=true; HTTP.Cookiemanager.addCookie(temp_sh,loginURL); MfG |
AW: Indy Login+Cookies
Zitat:
IdCookieManager1.AddCookies(Cookie,'domain.com'); E2010 Inkompatible Typen: 'TIdCookieManager' und 'string' Edit, ok so funktioniert das:
Code:
Melde mich gleich wieder obs mich weiter bringt :)
cookieURL:=TIdURI.Create('http://www.domain.com/');
HTTP.CookieManager.AddServerCookie(Cookie,cookieURL); Edit, Nein..hat mich noch nicht weiter gebracht :/ |
AW: Indy Login+Cookies
ich editiere mal kurz meinen quelltext rein mom.
Code:
so müsste das normal funktionieren. temp_sh kannste aus dem RecvPacket vom http.get(url) rausfiltern da stand ja schon setCookie: usw...
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; 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 |
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:
//Edit, macht auch eigentlich kein Sinn den Cookie nochmals in den Manager einzufügen. Die Ausgabe hat gezeigt das der Cookie bereits vorhanden ist.
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; |
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.
|
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: ![]() Anleitung (thx @ Apfelteig): ![]() 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:
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.
ReplyData := TStringStream.Create('', CP_UTF8); // wenn Webseite in utf-8 kodiert ist
try Get('http://www.deinewebseite.com/', ReplyData); finally ReplyData.Free; end; |
AW: Indy Login+Cookies
Hey! Danke für deine Tipps!
Zurzeit teste ich Delphi XE (Profil noch nicht updated) -> Welches Package ist das = ...150 oder ...160 ? (Delphi 2010 ist ...140) Greetings |
AW: Indy Login+Cookies
Die Zahl steht für die Delphi Version, die du im Delphi "About" Fenster siehst. (15 also für XE und 16 für XE 2, weil momentan werden schon fleißig Vorbereitungen für x64 getroffen)
Es sei noch gesagt, dass beim Update der Indy Komponenten andere Komponenten, die darauf aufbauen nicht mehr funktionieren z.b. DataSnap (müsste man erst neu erstellen). |
AW: Indy Login+Cookies
Hmm ok, trotz Indy Update(Indy 10.5.8) hat sich nichts an meiner Situation verändert.
|
AW: Indy Login+Cookies
Wenn du sonst noch nichts weiter angegeben hast, würde ich dir empfehlen den Indy Client zu "tarnen", siehe dazu:
![]() wie sieht denn dein Quellcode nun aus?
Delphi-Quellcode:
Wenn du mir die Domain gibst könnte ich mir das auch kurz mal genauer ansehen.
begin
with TIdHTTP.Create(nil) do try // Voreinstellungen; Schau hierzu mal in meine uIdHTTPHelper.pas with Params do begin WriteString('username=' + username + '&'); // siehe dazu: http://www.delphipraxis.net/1083544-post3.html end; Post('http://www.my-domain.com/login.php', Params, ReplyData); finally Free; end; end; |
AW: Indy Login+Cookies
So ich habe jetzt mit geskill 2,5 Stunden hin und her probiert und wir sind zu dem Ergebnis gekommen das der Code mit seiner Delphi 2010 Architect funktioniert und mit meinem Delphi XE Architect nicht funktioniert. Wir benutzen beide Indy 10.5.8.
Bei ihm klappt der Login, bei mir nicht! Hat jemand ne Idee woran es liegen könnte? PS: Am Code sicherlich aber trotzdem hiermal eine Rohfassung:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var lParams: TStringList; ResponseData: TStringStream; begin IdHTTP1.Request.Accept:='text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1'; IdHTTP1.Request.AcceptCharSet:='iso-8859-1, utf-8, utf-16, *;q=0.1'; IdHTTP1.Request.AcceptEncoding:='deflate, gzip, identity, *;q=0'; IdHTTP1.Request.Connection:='Keep-Alive'; IdHTTP1.Request.ContentType:='application/x-www-form-urlencoded'; IdHTTP1.Request.UserAgent:='Opera/9.80 (Windows NT 6.1; U; de) Presto/2.5.22 Version/10.51'; lParams:=TStringList.Create; ResponseData:=TStringStream.Create('',CP_UTF8); try try lParams.Values['username']:='Username'; lParams.Values['password']:='Password'; lParams.Values['submit']:='Login'; IdHTTP1.Post('http://www.my-domain.com',lParams, ResponseData); Memo1.Text:=ResponseData.DataString; ResponseData.Clear; except on Exception do ShowMessage('Exception'); end; finally lParams.Free; IdHTTP1.Free; ResponseData.Free; end; |
AW: Indy Login+Cookies
Ich hab eben Delphi 2010 installiert (Indy 10.5.5) und siehe da -> Es funktioniert!
Jetzt installier ich mal das neueste Indy um zu schauen ob es wirklich an Delphi XE liegt. Edit: Ok, es funktioniert unter D2010 auch mit Indy 10.5.8 ! Dann muss es was mit Delphi XE zu tun haben :( |
AW: Indy Login+Cookies
Installier mal das Package für D2010 in deinem XE. Kann mir nicht vorstellen, dass es an der IDE liegt.
|
AW: Indy Login+Cookies
Habe ich versucht -> Hat nichts genützt !
|
AW: Indy Login+Cookies
Push 8-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:51 Uhr. |
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