Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Verbindung zu Online-Shop (https://www.delphipraxis.net/196079-verbindung-zu-online-shop.html)

freimatz 21. Apr 2018 17:22


Verbindung zu Online-Shop
 
Hallo zusammen,

mit meinem Programm soll ich mich mit einem Online-Shop verbinden. Dazu habe ich vom Shop-Entwickler Informationen bekommen. Als ersten Schritt soll ich mit POST (vermutlich ist http gemeint) Name und Passwort schicken und bekomme dann ein Cookie. Mit diesem kann ich dann über einige URLs dann verschiedene Informationen abfragen. SSL ist auch ein Thema.
Ich gehe davon aus, dass man mit dem Shop-Entwickler noch reden kann, die API wird nur für mich gemacht.

Selber habe ich vor ca. sieben Jahren eine Anbindung an eine Site mit REST gemacht. Als Komponente hatte ich damals Indy. SSL und Cookies sind neu für mich. Für das Projekt habe ich XE2.

Als erstes interessieren mich eher grundsätzliche Fragen. Für Details würde ich dann später erst mal googeln. Wie gehe ich das am Besten an? Wieder Indy nehmen? Oder gibt es etwas besseres? Was davon sind Boardmittel? An anderer Stelle verwende ich für Dateidownload Wininet.
Was mich auch noch stört ist, dass mein Programm Name und Passwort des Shops kennen (und ggf. speichern) muss. Gibt es da noch andere Lösungen? Was muss man sonst noch alles beachten?

mjustin 21. Apr 2018 18:17

AW: Verbindung zu Online-Shop
 
Ein einzelner, minimaler HTTPS POST eines JSON Objekts mit Indy ist überschaubar:

Delphi-Quellcode:
program JSONPostExample;
 
{$APPTYPE CONSOLE}
 
uses
  IdHTTP, IdGlobal, SysUtils, Classes;
 
var
  HTTP: TIdHTTP;
  RequestBody: TStream;
  ResponseBody: string;
begin
  HTTP := TIdHTTP.Create;
  try
    try
      RequestBody := TStringStream.Create('{"日本語":42}',
        TEncoding.UTF8);
      try
        HTTP.Request.Accept := 'application/json';
        HTTP.Request.ContentType := 'application/json';
        ResponseBody := HTTP.Post('https://httpbin.org/post',
          RequestBody);
        WriteLn(ResponseBody);
        WriteLn(HTTP.ResponseText);
      finally
        RequestBody.Free;
      end;
    except
      on E: EIdHTTPProtocolException do
      begin
        WriteLn(E.Message);
        WriteLn(E.ErrorMessage);
      end;
      on E: Exception do
      begin
        WriteLn(E.Message);
      end;
    end;
  finally
    HTTP.Free;
  end;
  ReadLn;
end.
Quellen:
- https://mikejustin.wordpress.com/201...-6-https-post/
- http://stackoverflow.com/a/28493431/80901
- http://stackoverflow.com/a/9254967/80901
- http://www.indyproject.org/sockets/b.../20141222.aspx

Die OpenSSL DLLS müssen dazu im Programmverzeichnis liegen.
(JSON ist neben XML ein häufig in HTTP-APIs eingesetzter Standard)

timog 21. Apr 2018 18:21

AW: Verbindung zu Online-Shop
 
Prinzipiell sind die Indys nicht verkehrt, wie das Beispiel von mjustin zeigt :-)

Es gibt auch Alternativen, mit der Forumssuche wirst Du einige weitere Beispiele zu den Indy und Alternativen (SecureBlackBox, SecureBridge etc.) finden können. SSL benötigt bei Indy halt zwei externe openSSL DLLs. Wininet kenne ich nicht, die Bordmittel von XE2 habe ich nicht mehr auf dem Schirm.

Generell sollte gelten: POSTs mit Benutzernamen und Kennwort nicht über HTTP, sondern über HTTPS (also SSL).

Zu den Anmeldedaten wird auf dem Client irgendwas gespeichert sein bzw. jedes Mal abgefragt werden: ein Token (OAuth, JWT), von dem der Shop bestimmt, wann es abläuft; Benutzername und Kennwort zum Anfordern eines Cookies oder Tokens; oder (ggf. aufwändiger) Client Zertifikate, etc.

Zugangsdaten auf dem Client immer verschlüsselt speichern, Kennwörter eigentlich als Hash, aber da Du das Kennwort wahrscheinlich im Klartext an den Webshop senden musst, wohl mit (AES-) Verschlüsselung auf dem Client speichern.

freimatz 21. Apr 2018 18:24

AW: Verbindung zu Online-Shop
 
Ach ja JSON, habe ich vergessen. Das soll auch hier zum Einsatz kommen. In meiner Firma verwenden wir das auch schon. Danke schon mal.

Codehunter 22. Apr 2018 11:16

AW: Verbindung zu Online-Shop
 
Um Cookies brauchst du dich in einfachen Fällen bei Indy nicht zu kümmern. Dafür gibts einen fertigen Cookiemanager als Komponente. Nur wenn Cookies clientseitig modifiziert werden müssen, wie das JavaScript bisweilen tut, musst du da selbst Hand anlegen. Den Cookiemanager verknüpfst du mit TIdHTTP, sorgst dafür dass die SSL-DLLs für Indy erreichbar sind, der Rest entspricht dem obigen Codebeispiel von mjustin.

mjustin 22. Apr 2018 11:41

AW: Verbindung zu Online-Shop
 
Zitat:

Zitat von freimatz (Beitrag 1400088)
Was mich auch noch stört ist, dass mein Programm Name und Passwort des Shops kennen (und ggf. speichern) muss.

Wird die Anmeldung nur einmal bei der ersten Verbindung benötigt, und dazu manuell eingegeben?
Dann brauchen Benutzername und Password nicht gespeichert werden, wenn für alle weiteren Anfragen das erwähnte Cookie wieder benutzt werden
Dieses muss man (bei Indy über den Cookiemanager) jedesmal neu senden, und vermutlich kann man es dazu einfach lokal speichern.

Wenn das Cookie nur eine begrenzte Gültigkeit hat (z.B. eine Woche), muss Benutzername / Passwort nach dem Ablauf des Cookies wieder neu eingegeben werden.
Es ist aber auch möglich und auch vom Betreiber vorgesehen, das Cookie automatisch zu verlängern, bevor es abläuft.

freimatz 24. Apr 2018 15:55

AW: Verbindung zu Online-Shop
 
Ich nehme an, dass mein Programm schon immer wieder mal nachschauen soll, ob der Anwender inzwischen wieder was Neues gekauft hat. Noch nicht klar ist ob das auf Knopfdruck oder Regelmäßig erfolgen soll. Wenn es was Neues gibt, soll mein Programm das laden und verwenden. Ich stelle mir es lästig vor, wenn ich als Anwender jedesmal wieder Name und Passwort eingeben müsste.

Wie dem aus sei - ich habe nun einiges an Stoff zum Forschen, Überlegen, Diskutieren und Implementieren.
Danke für alle Meldungen:thumb:

Codehunter 24. Apr 2018 17:23

AW: Verbindung zu Online-Shop
 
Für den Anwender sollte es konfigurierbar sein ob das Programm zyklisch oder manuell Daten abruft - siehe übliche Vorgehensweise bei Mailern, POP3-Abruf etc.

Natürlich kannst du Zugangsdaten auch lokal speichern. Das macht jeder Webbrowser schließlich auch. Versteht sich von selbst, dass dies verschlüsselt erfolgen muss und dabei auf Standardverfahren gesetzt werden sollte. Nichts ist unsicherer als eine handgeschraubte Verschlüsselung.

freimatz 2. Jun 2018 12:40

AW: Verbindung zu Online-Shop
 
Hallo zusammen,
Danke für alle Hinwiese bislang. Ich habe nun mich für Indy entschieden und Versuche gestartet. Der durchschlagende Erfolg bleibt bislang aus. Basis ist der Vorschlag oben von mjustin. Nach eine "401 Unauthorized" habe ich den erweitert und sieht im Kern nun so aus (persönliche Daten geändert):

Delphi-Quellcode:
      RequestBody := TStringStream.Create('{"日本語":42}', TEncoding.UTF8);
      try
        HTTP.Request.Accept := 'application/json';
        HTTP.Request.ContentType := 'application/json';

        HTTP.Request.Username := 'bla@fasel.de';
        HTTP.Request.Password := 'yTM45ojg5vB50g';
        HTTP.Request.BasicAuthentication := true;

        ResponseBody := HTTP.Post('https://dingsda.de/dada-api/login', RequestBody);
Allerdings kommt noch immer der 401.

Hier noch der Text vom Betreiber:

Zitat:

wir sind von ... mit der Implementation eine API zur ... in den Shop beauftragt.

Für die Anbindung von ... an die ...-API erhalten Sie hiermit die erforderlichen Endpunkte.
Die Endpunkte müssen über SSL (Port 443) angesprochen werden und liefern JSON als Rückmeldung.

Aktuell wird das Zertifikat als nicht valide eingestuft. Wir sind gerade dabei diesen Umstand zu beheben.

Host: https://dingsda.de

Die Zugangsdaten für das .htaccess sind "demo" und "demo".

Endpunkt:
Login: /dada-api/login
Erforderliche Paramter sind <email> und <password>. Endpunkt muss über POST angesprochen werden.
Sie erhalten im Antwort-Header ein Cookie, welches für die Session verwendet wird und für die weiteren Endpunkte erforderlich ist.

Die Antwortet beinhaltet den Status "ok" oder "error", und ggf. die entsprechende Fehlermeldung.

Mach ich da noch was falsch? Was? Danke für Infos.

Codehunter 2. Jun 2018 12:46

AW: Verbindung zu Online-Shop
 
Ich würde vorschlagen du liest den von dir selbst zitierten Text noch mal in aller Ruhe durch. Die entscheidende Information steht drinnen :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:14 Uhr.
Seite 1 von 2  1 2      

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