AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Anmelden an Webmodul über IdHTTP
Thema durchsuchen
Ansicht
Themen-Optionen

Anmelden an Webmodul über IdHTTP

Ein Thema von fwn · begonnen am 8. Apr 2013 · letzter Beitrag vom 11. Apr 2013
Antwort Antwort
Seite 1 von 3  1 23      
fwn

Registriert seit: 8. Apr 2013
3 Beiträge
 
#1

Anmelden an Webmodul über IdHTTP

  Alt 8. Apr 2013, 17:02
Hallo zusammen,

ich versuche grade mich in die Entwicklung eines Webservers unter Delphi XE3 einzuarbeiten. Ich habe dazu ein Webmodul mit einigen WebActionItems erstellt, die ich auch über meinen Browser ohne Probleme ansprechen kann. Jetzt möchte ich gerne mithilfe der IdHTTP Unit eine Clientanwendung erstellen, die mit diesem Server kommuniziert. Leider komme ich bei der Übermittlung von Benutzername und Passwort nicht so recht voran.
Ich gehe dabei auf der Clientseite wie folgt vor:

Code:
HTTP := TIdHTTP.Create;
HTTP.Request.BasicAuthentication := True;
HTTP.HandleRedirects := True;
HTTP.Request.Username := Benutzername;
HTTP.Request.Password := Passwort;

Response := HTTP.Get(URL);
Ich kann auf diese weise zwar die Webactions ansprechen, aber ich konnte bis jetzt keine Möglichkeit finden den Benutzernamen und das Passwort im Webmodul wieder auszulesen. Es gibt in dem WebRequest Objekt keine ensprechenden Felder und sie scheinen auch in keinem der anderen Felder zu liegen. Ich habe auch schon versucht über die OnParseAuthentication der TIdHTTPWebBrokerBridge dranzukommen, auch ohne Erfolg. Kann mir da vieleicht jemand weiterhelfen?

Gruß,
Florian
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Anmelden an Webmodul über IdHTTP

  Alt 8. Apr 2013, 18:02
Hallo,

bei Indy 10 gibt es unter Bubbles\Boxtests\ eine HTTPServer.pas. In der ist eine
Delphi-Quellcode:
procedure THTTPServer.HTTPServerCommandGet(AContext:TIdContext;
  RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
und dort wir die Anmeldung per
Delphi-Quellcode:
  if FUseAuthenticaiton and
     ((RequestInfo.AuthUsername <> 'Indy') or (RequestInfo.AuthPassword <> 'rocks')) then
  begin
    AuthFailed;
    exit;
  end;
abgefragt. Hilft Dir das weiter?
  Mit Zitat antworten Zitat
fwn

Registriert seit: 8. Apr 2013
3 Beiträge
 
#3

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 08:04
Hallo,

danke für die schnelle Antwort!
Ich habe jetzt schon recht viel mit dem TWebModule fertig programmiert und würde deshalb eine Lösung, die dieses benutzt bevorzugen. Ich werde den Indy Server aber auf jeden Fall im Hinerkopf behalten, falls es mit dem Module gar nicht klappt.

Geändert von fwn ( 9. Apr 2013 um 08:38 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 11:29
Hallo,
Hallo,

danke für die schnelle Antwort!
Ich habe jetzt schon recht viel mit dem TWebModule fertig programmiert und würde deshalb eine Lösung, die dieses benutzt bevorzugen. Ich werde den Indy Server aber auf jeden Fall im Hinerkopf behalten, falls es mit dem Module gar nicht klappt.
mir ging es eigentlich garnicht um die Nutzung des HTTPServers sondern nur darum, ob Du eventuell "irgendwo" die Attribute RequestInfo.AuthUsername oder RequestInfo.AuthPassword finden und nutzen kannst.

Habe mal ein Webmodul zusammengedaddelt, das alle Zeichenfolgen aus dem Request als HTML-Seite zurückgibt. Eventuell kannst Du ja damit was anfangen oder sehen ob und wo Benutzer und Passwort im Request enthalten sind. Bin mir allerdings nicht sicher, ob diese Informationen überhaupt vom Server an ein Webmodul weitergegeben werden.
Delphi-Quellcode:
procedure TWebModuleRequest.waiRequestAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  sl : TStringList;
  slResponse : TStringList;
begin
  sl := TStringList.Create;
  slResponse := TStringList.Create;
  try
    slResponse.Add('<html><head><title>Request-Inhalt</title></head><body>');
    slResponse.Add('<h1>Request-Inhalt</h1><hr />');
    slResponse.Add('<table border="1" cellspacing="3">');
    Request.ExtractContentFields(sl);
    slResponse.Add('<tr><td>ContentFields</td><td>');
    slResponse.AddStrings(sl);
    slResponse.Add('</td></tr>');
    Request.ExtractCookieFields(sl);
    slResponse.Add('<tr><td>CookieFields</td><td>');
    slResponse.AddStrings(sl);
    slResponse.Add('</td></tr>');
    Request.ExtractQueryFields(sl);
    slResponse.Add('<tr><td>QueryFields</td><td>');
    slResponse.AddStrings(sl);
    slResponse.Add('</td></tr>');
    slResponse.Add('<tr><td>Accept</td><td>' + Request.Accept + '</td></tr>');
    slResponse.Add('<tr><td>CacheControl</td><td>' + Request.CacheControl + '</td></tr>');
    slResponse.Add('<tr><td>Connection</td><td>' + Request.Connection + '</td></tr>');
    slResponse.Add('<tr><td>Content</td><td>' + Request.Content + '</td></tr>');
    slResponse.Add('<tr><td>ContentEncoding</td><td>' + Request.ContentEncoding + '</td></tr>');
    slResponse.Add('<tr><td>ContentType</td><td>' + Request.ContentType + '</td></tr>');
    slResponse.Add('<tr><td>ContentVersion</td><td>' + Request.ContentVersion + '</td></tr>');
    slResponse.Add('<tr><td>Cookie</td><td>' + Request.Cookie + '</td></tr>');
    slResponse.Add('<tr><td>DerivedFrom</td><td>' + Request.DerivedFrom + '</td></tr>');
    slResponse.Add('<tr><td>From</td><td>' + Request.From + '</td></tr>');
    slResponse.Add('<tr><td>Host</td><td>' + Request.Host + '</td></tr>');
    slResponse.Add('<tr><td>InternalPathInfo</td><td>' + Request.InternalPathInfo + '</td></tr>');
    slResponse.Add('<tr><td>InternalScriptName</td><td>' + Request.InternalScriptName + '</td></tr>');
    slResponse.Add('<tr><td>Method</td><td>' + Request.Method + '</td></tr>');
    slResponse.Add('<tr><td>PathInfo</td><td>' + Request.PathInfo + '</td></tr>');
    slResponse.Add('<tr><td>PathTranslated</td><td>' + Request.PathTranslated + '</td></tr>');
    slResponse.Add('<tr><td>ProtocolVersion</td><td>' + Request.ProtocolVersion + '</td></tr>');
    slResponse.Add('<tr><td>Query</td><td>' + Request.Query + '</td></tr>');
    slResponse.Add('<tr><td>Referer</td><td>' + Request.Referer + '</td></tr>');
    slResponse.Add('<tr><td>RemoteAddr</td><td>' + Request.RemoteAddr + '</td></tr>');
    slResponse.Add('<tr><td>RemoteHost</td><td>' + Request.RemoteHost + '</td></tr>');
    slResponse.Add('<tr><td>ScriptName</td><td>' + Request.ScriptName + '</td></tr>');
    slResponse.Add('<tr><td>Title</td><td>' + Request.Title + '</td></tr>');
    slResponse.Add('<tr><td>URL</td><td>' + Request.URL + '</td></tr>');
    slResponse.Add('<tr><td>UserAgent</td><td>' + Request.UserAgent + '</td></tr>');
    slResponse.Add('</table></body></html>');
    Response.Content := slResponse.Text;
  except
    on e : Exception do begin
      Response.Content := e.Message;
    end;
  end;
  slResponse.Free;
  sl.Free;
  Handled := true;
end;
  Mit Zitat antworten Zitat
fwn

Registriert seit: 8. Apr 2013
3 Beiträge
 
#5

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 15:13
Hallo!

Hallo,
mir ging es eigentlich garnicht um die Nutzung des HTTPServers sondern nur darum, ob Du eventuell "irgendwo" die Attribute RequestInfo.AuthUsername oder RequestInfo.AuthPassword finden und nutzen kannst.
ah, ok, hatte ich dann falsch verstanden Ich habe eben einmal danach gesucht, es sieht nicht so aus als würde ich da dran kommen.

Habe mal ein Webmodul zusammengedaddelt, das alle Zeichenfolgen aus dem Request als HTML-Seite zurückgibt. Eventuell kannst Du ja damit was anfangen oder sehen ob und wo Benutzer und Passwort im Request enthalten sind. Bin mir allerdings nicht sicher, ob diese Informationen überhaupt vom Server an ein Webmodul weitergegeben werden.
Delphi-Quellcode:
procedure TWebModuleRequest.waiRequestAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  sl : TStringList;
  slResponse : TStringList;
begin
  sl := TStringList.Create;
  slResponse := TStringList.Create;
  try
    slResponse.Add('<html><head><title>Request-Inhalt</title></head><body>');
    slResponse.Add('<h1>Request-Inhalt</h1><hr />');
    slResponse.Add('<table border="1" cellspacing="3">');
    Request.ExtractContentFields(sl);
    slResponse.Add('<tr><td>ContentFields</td><td>');
    slResponse.AddStrings(sl);
    slResponse.Add('</td></tr>');
    Request.ExtractCookieFields(sl);
    slResponse.Add('<tr><td>CookieFields</td><td>');
    slResponse.AddStrings(sl);
    slResponse.Add('</td></tr>');
    Request.ExtractQueryFields(sl);
    slResponse.Add('<tr><td>QueryFields</td><td>');
    slResponse.AddStrings(sl);
    slResponse.Add('</td></tr>');
    slResponse.Add('<tr><td>Accept</td><td>' + Request.Accept + '</td></tr>');
    slResponse.Add('<tr><td>CacheControl</td><td>' + Request.CacheControl + '</td></tr>');
    slResponse.Add('<tr><td>Connection</td><td>' + Request.Connection + '</td></tr>');
    slResponse.Add('<tr><td>Content</td><td>' + Request.Content + '</td></tr>');
    slResponse.Add('<tr><td>ContentEncoding</td><td>' + Request.ContentEncoding + '</td></tr>');
    slResponse.Add('<tr><td>ContentType</td><td>' + Request.ContentType + '</td></tr>');
    slResponse.Add('<tr><td>ContentVersion</td><td>' + Request.ContentVersion + '</td></tr>');
    slResponse.Add('<tr><td>Cookie</td><td>' + Request.Cookie + '</td></tr>');
    slResponse.Add('<tr><td>DerivedFrom</td><td>' + Request.DerivedFrom + '</td></tr>');
    slResponse.Add('<tr><td>From</td><td>' + Request.From + '</td></tr>');
    slResponse.Add('<tr><td>Host</td><td>' + Request.Host + '</td></tr>');
    slResponse.Add('<tr><td>InternalPathInfo</td><td>' + Request.InternalPathInfo + '</td></tr>');
    slResponse.Add('<tr><td>InternalScriptName</td><td>' + Request.InternalScriptName + '</td></tr>');
    slResponse.Add('<tr><td>Method</td><td>' + Request.Method + '</td></tr>');
    slResponse.Add('<tr><td>PathInfo</td><td>' + Request.PathInfo + '</td></tr>');
    slResponse.Add('<tr><td>PathTranslated</td><td>' + Request.PathTranslated + '</td></tr>');
    slResponse.Add('<tr><td>ProtocolVersion</td><td>' + Request.ProtocolVersion + '</td></tr>');
    slResponse.Add('<tr><td>Query</td><td>' + Request.Query + '</td></tr>');
    slResponse.Add('<tr><td>Referer</td><td>' + Request.Referer + '</td></tr>');
    slResponse.Add('<tr><td>RemoteAddr</td><td>' + Request.RemoteAddr + '</td></tr>');
    slResponse.Add('<tr><td>RemoteHost</td><td>' + Request.RemoteHost + '</td></tr>');
    slResponse.Add('<tr><td>ScriptName</td><td>' + Request.ScriptName + '</td></tr>');
    slResponse.Add('<tr><td>Title</td><td>' + Request.Title + '</td></tr>');
    slResponse.Add('<tr><td>URL</td><td>' + Request.URL + '</td></tr>');
    slResponse.Add('<tr><td>UserAgent</td><td>' + Request.UserAgent + '</td></tr>');
    slResponse.Add('</table></body></html>');
    Response.Content := slResponse.Text;
  except
    on e : Exception do begin
      Response.Content := e.Message;
    end;
  end;
  slResponse.Free;
  sl.Free;
  Handled := true;
end;
Vielen Dank für die Mühe
So etwas ähnliches hatte ich auch schon versucht, leider sind die meisten der Felder leer, die anderen enthalten nicht die Login-Informationen. Ich vermute inzwischen, dass ich für die Authentifizierung noch ne zusätzliche Komponente brauche, die ich auf das Webmodul legen muss, ich habe aber bis jetzt nicht die richtige finden können.
Ich arbeite mich jetzt grade durch das Tutorial hier das ich heute gefunden habe. Da mein Server später auch über JSON mit dem Client kommunizieren soll hoffe ich, dass mir das weiterhelfen wird.

Gruß,
Florian
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#6

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 15:39
Schau mal dort.

Über Request.Authorization kann dieser String ausgelesen werden. Dann das Leerzeichen suchen, alles bis zu diesem Punkt entfernen und den Rest mit TIdDecoderMIME.DecodeString in Klartext zurückverwandeln. Dort wieder der Doppelpunkt suchen und man erhält den übergebene Usernamen sowie das Passwort.
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 15:47
Hallo,

da wirst Du (vermutlich) keine Komponente finden.

Habe vor längerer Zeut mal 'nen Webserver geschrieben, dort komme ich an die Anmeldeinformationen.

In den ISAPI.dll's und CGI-Programmen habe ich bisher keine Möglichkeit gefunden.
Dort mache ich eine Anmeldung immer über das Webmodul, indem es selbst die Anmeldedaten anfordert. D. H.: für jedes Webmodul gibt es eine eigene Anmeldung.

Das Ganze kann man "vereinfachen", wenn man eine entsprechende Klasse hat, die man in jedes Webmodul "hineinsteckt". Die Anmeldedaten habe ich dann nach erfolgreicher Anmeldung per Cookie immer "hin- und hergeschleppt". Erscheint mit suboptimal, aber eine andere Lösung hatte ich seinerzeit nicht gefunden.

Man könnte die Anmeldedaten in einer kleinen Datenbank speichern und gegen diese Username und Passwort prüfen und als Ergebnis die MD5-Summe dieser beiden Werte per Cookie durch die Gegend schieben. Bei jeder Anfrage an das Webmodul muss dieses dann gegen die Datenbank prüfen, ob es die MD5-Summe aus dem Cookie kennt, wenn ja, liegt die Vermutung nahe, dass sie von einem berechtigten Nutzer kommt. Schön ist diese Lösung allerdings nicht. Ok: habe nie professionelle Software über diesen Weg schreiben müssen, sondern nur kleine, nur intern zu nutzende, Anwendungen.

Ansonsten fiele mir nur noch eine Sessionverwaltung ein, bei der zuerst die Anmeldedaten vom Anwender geprüft werden und dann eine SessionID ausgetauscht wird.
Fehlt die, findet keine Kommunikation statt oder es werden die Anmeldedaten angefragt. Als SessionID könnte man dann auch die MD5-Summe nehmen.

Ach, irgendwie habe ich keine vernünftige Idee

Wie forderst Du die Anmeldedaten an?
Muss der Browser den entsprechenden Dialog öffnen, dann müsste Thoms Hinweis umsetzbar sein. Allerdings scheint (bei mir?) Request.Authorization immer leer zu sein.

Geändert von nahpets ( 9. Apr 2013 um 16:02 Uhr) Grund: Edit hat viele Schreibfehler gefunden (hoffentlich alle ;-))
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 16:22
Hier ist ein passendes Thema mit Sourccode zum Auslesen der Basic Authentication Daten aus einem TWebRequest:

http://www.delphipraxis.net/45200-we...ebrequest.html

Wenn der Client die Basic Auth Parameter setzt wie im Ausgangsartikel beschrieben, sollte das Feld Request.Authorization nicht leer sein und mit dem Code in obigem Link entschlüsselbar seim.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#9

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 16:47
Ich hatte das vorhin mit einer Kombination aus einem Programm mit TIdHTTP (Delphi XE3) und einer 64Bit-ISAPI-DLL (Delphi XE2) auf einem Windows Server 2008 ausprobiert:

Server:
Delphi-Quellcode:
procedure TWebModule1.WebModule1TestAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  N: Integer;
  S: String;
begin
  S := Request.Authorization;
  N := Pos(' ',s);
  if N > 0 then
  begin
    Delete(S,1,n);
    S := TIdDecoderMIME.DecodeString(S);
    N := Pos(':',S);
    if N > 0 then
    begin
      Response.Content:=Format('Username: %s'+sLineBreak+'Password: %s',[Copy(S,1,N-1),Copy(S,N+1,Length(S)-N+1)]);
      Exit;
    end;
  end;
  Response.Content:='Error';
end;
Klient:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP: TIdHTTP;
begin
  HTTP := TIdHTTP.Create;
  try
    HTTP.Request.BasicAuthentication := True;
    HTTP.HandleRedirects := True;
    HTTP.Request.Username := Edit1.Text;
    HTTP.Request.Password := Edit2.Text;
    Memo1.Lines.Text := HTTP.Get('http://maps4delphi.com/test');
  finally
    HTTP.Free;
  end;
end;
client.png

Hinweis: Der Link zum Server ist nur temporär gültig.

@mjustin:
Hatte ich nicht genau das beschrieben!?
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 17:44
Hallo,

jetzt fange ich (hoffentlich) an, das Problem zu verstehen (oder eher zu erahnen).

Wenn Client und WebModul mit Indy... erstellt wurden scheint das Verhalten anders zu sein, als bei einer Nutzung von Browser und Webmodul.

Hab' eben mal 'ne Isapi.dll geschrieben, aber (bisher) vom Browser dort keine Anmeldeinformationen erhalten. Auch dann nicht, wenn ich den Webserver so konfiguriere, dass er eine Anmeldung verlangt.

Der Browser zeigt mir dann den Anmeldedialog an und fragt nach Benutzername und Passwort. Der Webserver protokolliert die erfolgreiche Anmeldung, aber in der Isapi.dll kann ich davon nichts finden.

Wenn ich die von Thom geschriebenen Quelltexte nutzte, sowohl in einem neuen Client, als auch in einer neuen ISAPI.dll, so bekomme ich von seiner Seite die Anmeldeinformationen geliefert. In einer mit Delphi 7 erstellten ISAPI.dll bekomme ich bei 1:1 übernommenem Quelltext gegen meinen eigenen Webserver keine Benutzerinformationen. Mein Webserver protokolliert aber die Anmeldedaten, muss sie von daher also kennen. Bei ungültigen Anmeldedaten gibt er den Fehler 401 zurück.

Sollte hier die Funktionalität abhängig von der Delphiversion sein oder vom Webserver?

Das wäre sehr ärgerlich

@Thom

Wie kann ich per Browser von Deiner Seite eine Antwort <> Error erhalten?

Mit Firefox ist theoretisch eine Anmeldung in der Form möglich:
Code:
http://peter:paul@maps4delphi.com/test
Diese funktioniert bei Deiner Seite jedoch nicht, daher gehe ich davon aus, dass die Anmeldeinformationen nicht in der ISAPI.Dll ankommen.

Aber das lenkt jetzt von eigentlichen Problem ab.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz