Wie binde ich einen separaten Kundendaten-Server an Login/Registrierung?

Hallo zusammen,

wir verkaufen eine App, die eine Art Forenfunktion bietet. Das bedeutet, dass unsere Kunden sich Accounts angelegt haben und dann die App normal nutzen. Diese App hat ganz gewöhnliche Android/iPhone Cients und kommunziert mit einem REST-Server, der Nutzerdaten, Forenposts etc. verwaltet. Sprich - bis jetzt hatte das ganze nichts mit Shopware zu tun und unsere Architektur/Infrastruktur ist nicht sehr flexibel.

Jetzt möchten wir zu diesem Forum noch einen Shopware-Shop ergänzen, der mit den Daten der App integriert sein sollte. Das bedeutet, dass ein Teil der Daten (z.B. Passwort, E-Mail) nicht nur in Shopware hinterlegt werden müssen, sondern auch direkt aus dem Server angefragt werden sollten. Ich schildere mal ein paar Situationen, damit ihr besser versteht, was ich meine.

Situation 1: Kunden-Login im Shop
Der Kunde möchte sich einloggen und besucht /account. Hier findet sich das Standard Shopware Login Formular. Der Kunde gibt die Daten an, mit denen er sich schon in der App registriert hat. Sein Request landet bei engine/Shopware/Controllers/Frontend/Account.php::Shopware_Controllers_Frontend_Account->loginAction() und damit ultimativ bei engine/Shopware/Core/sAdmin.php::sAdmin->sLogin(). An dieser Stelle würde ich gerne hooken/irgendwie eingreifen und statt der SQL-Query einen HTTP-Request an den App-Server schicken, um zu prüfen, ob die Credentials gültig sind. Außerdem würde ich dann (falls noch nicht vorhanden) einen Shopware-Customer für diesen Nutzer aus bereits vorhandenen Daten generieren. Damit wäre der Kunde eingeloggt, sowohl in Shopware, als auch in dem App-Server.

Situation 2: Kunden-Registrierung im Shop
Der Kunde möchte sich registrieren und nutzt wieder das Standard Shopware Formular. Hier sollte dann nicht nur ein Shopware-Customer angelegt werden, sondern auch ein Request an den App-Server gehen, der dort den Kunden ebenfalls hinterlegt.

Situation 3: Datenänderung im Shop
Wenn der Kunde seine Daten (Password, Addresse…) ändert, dann sollte auch das gehookt werden und ein Request an den App-Server rausgehen, um die Daten auf beiden Datenbanken synchron zu halten.

Situation 4: Datenänderung auf App-Server
Natürlich kann der Kunde auch in der App seine Daten ändern. Dann würde aber der App-Server einfach über die Shopware REST Schnittstelle auch die Daten in Shopware ändern können, oder? Diese Richtung sollte also kein Problem sein.

Konkrete Fragen:

  • Wie kann ich den Login hooken? Die einzige Überlegung, die ich bis jetzt habe, war das Event ‚Shopware_Modules_Admin_Login_Start‘ aus sLogin() zu hooken und da irgendwas zu zaubern.
  • Wie hooke ich die Datenänderung, wenn ein Nutzer seine Adresse o.ä. in Shopware verändert? Da müsste ich ja auch wieder einen Request an den App-Server mit den Änderungen stellen.
  • Hat jemand einen insgesamt einen besseren Vorschlag? Ich bin offen für jeden Ansatz.

System-Infos:

  • Shopware 5.5.4
  • App-Server frei über das Internet erreichbar.
  • App-Datenbanken und Shopware können nicht auf den gleichen Server, eine reine Integration über die Datenbank ist also nicht möglich. Es muss ein HTTP-Request an den App-Server rausgehen.

Ich danke euch für jegliche Anstöße. Falls jemand ein Plugin kennt, das bereits diese oder eine ähnliche Funktionalität abbildet, dann wäre ich sehr daran interessiert mal den Source Code des Plugins zu lesen.

Grüße!

Nachtrag: Wenn jemand einen anderen guten Platz kennt, um diese Frage zu stellen, dann würde ich mich über Links freuen!

Aufgabe zumindest teilweise gelöst! Die Leute aus dem Shopware Gitter konnten mir sehr gut weiterhelfen. Hier der relevante Teil unserer Gespräche, automatisch konvertiert:

Shyim - 16:50
Du hast eine Sportliche Aufgabe vor dir :smiley:

Plex - 16:50
I know :cry: Aber gehe ich wenigstens den leichtesten Weg?

Shyim - 16:51
Musst du denn wirklich alles zurück synchen?

Timo Helmke - 16:52
Lustig das du fragst… Ich hab in den letzten 2-3 Monaten zwei verschiedene Dienste angebunden :smiley:

Plex - 16:53
@shyim Alle Daten die sowohl in Shopware als auch schon im App-Server liegen müssen brauchen zwangsweise eine Synchronisierung für eine konsistente UX.
Hast du Erfahrungen, die du teilen kannst @t2oh4e? Ging es konkret auch um Login & Co.?

Timo Helmke - 16:54
Login, Registrierung, Sync von Nutzerdaten zurück ins Zielsystem… 2x etwas unterschiedlich aber prinzipiell genau das, ja.

Plex - 16:56
Sehr cool! Hättest du Lust mal deine Erfahrungen im Forenpost zu schildern und ein paar Tipps (oder besser noch Source Code :stuck_out_tongue_closed_eyes:) zu teilen? Dann stören wir hier nicht den Chat :slight_smile:

benjamintypzwo - 16:57
Kannst du nicht einfach permanent 2-way syncen bei jeder Änderung? also von deinem service bei änderung -> shopware und von shopware bei änderung -> dein service? dann musst du initial einmal syncen und der rest ist einfach und unabhängig

Plex - 16:59
Ja, das ist auch ein Teil der Frage (vgl. Situation 2,3,4). Aber du hast recht, das Login-Hook Problem (Situation 1) wäre damit ja automatisch gelöst.

Timo Helmke - 16:59
Für deinen ersten Punkt würde ich glaube ich das Ziel vom Login-Formular auf einen eigenen Shopware-Controller ändern, dort deinen Request auf das externe System machen, anhand der Daten prüfen ob es den Benutzer schon in Shopware gibt: Wenn ja, einloggen, wenn nein anlegen. Passwort in Shopware würde ich einfach random generieren und das bei positiver Rückmeldung einfach in den Request schreiben. und dann die Login-Methode aus sAdmin aufrufen.
Wenn du alle Daten inkl. Passwort synchen willst würde sich der erste Punkt erledigen, setzt allerdings vorraus, dass du alle Accounts sofort zu Shopware synchst

benjamintypzwo - 17:00
@plex017_gitlab genau so meine ich das - hast auch noch den vorteil dass dein shop unabhängig vom service bleibt

Plex - 17:02
@t2oh4e Ja, ich glaube Situation 1 können wir dann mal aus der Gleichung rausnehmen. Da hab ich den Wald vor lauter Bäumen nicht gesehen. Danke dafür schonmal euch beiden! Über die Shopware REST API sollte ja die Situation 4 auch lösbar sein. Bleibt nur noch die Richtung Shopware->App. Gibt es eine globale Hook für einen Datenänderung von Kunden (Passwort, E-Mail, egal welches Feld)?

Timo Helmke - 17:03
Guck dir mal den Customer Service an

Plex - 17:05
Umm, ist das ein Doc-Eintrag oder eine Source-Datei? Hast du mal einen URL? (Link zu Doc oder Pfad)

Timo Helmke - 17:05
engine/Shopware/Bundle/AccountBundle/Service/CustomerService.php der hat eine update-Methode, darüber sollte alles laufen was den Kunden direkt betrifft (Passwort, E-Mail, Vor- Nachname)
Kannste dekorieren und davor/danach die Daten in dein externes system schreiben

Plex - 17:06
Triggered die auch bei Erstellung eines Kunden? Das ist ja theoretisch kein update.

Timo Helmke - 17:06
Nein, aber dafür gibt es einen RegisterService :smiley:
engine/Shopware/Bundle/AccountBundle/Service/RegisterService.php
Falls du Adressdaten synchen willst gibt es auch noch einen AddressService

benjamintypzwo - 17:07
@plex017_gitlab ohne Gewähr, du brauchst vermutlich ein paar Hooks auf saveProfileAction, saveEmailAction, savePaymentAction, editAction auf Account bzw address

Timo Helmke - 17:08
nope… die laufen alle in den customer bzw address service

Plex - 17:08
@t2oh4e Fantastisch! Aber warum sind die Adressdaten denn nicht mit im CustomerService::update?

Timo Helmke - 17:08
wobei… bei payment bin ich mir gerade nicht sicher
Weil Shopware an der Stelle zwischen den Daten die direkt zum Kunden gehören (email, passwort,…) und den adressen die nur indirekt zum kunden gehören unterscheidet

benjamintypzwo - 17:09
wie gesagt, ohne gewähr aber so ist es jedenfalls mindestens einmal gelöst wurden - soviel kann ich verraten ^^

Plex - 17:10
Gibt es irgendwo ein Doc, was genauer auf diese Problematik “Reagieren auf ALLE (Payment, Adresse, Customer) Datenänderungen” eingeht, damit ich eure Ideen versuche und bei Problemen da weiterlese? :laughing:

Timo Helmke - 17:11
Ich glaube das ist zu speziell für irgendeine Dokumentation :smiley:

Shyim - 17:11
Also Account selber ist im Default nicht sooo tragisch. Da das meiste seit 5.2 via ORM passiert
eben Lifecycleevents

Plex - 17:12
“Also Account selber ist im Default nicht sooo tragisch. Da das meiste seit 5.2 via ORM passiert”
Was meinst du?

benjamintypzwo - 17:12
die liegen in verschiedenen controllern… die events die ich eben aufgezählt hab funktionieren jedenfalls für uns. ansonsten kannst du auch das orm hooken denke ich

Timo Helmke - 17:13
Ist am Ende wohl ne Glaubensfrage :smiley: Ich finde Services dekorieren schöner und zentraler als die Hooks. Funktionieren sollte am Ende beides. Ebenso wie die ORM Events

Plex - 17:15
Ich bin noch glaubensfrei und konvertiere gerade in alle Richtungen ein bisschen :smiley:
Okay, ich danke euch erstmal für eure Hilfe. Ich versuche mich mal und würde mich evtl. nochmal melden.

Timo Helmke - 17:15
Wir haben uns übrigens dafür entschieden nicht alle Kunden zu synchen sondern das nur bei Login zu tun, damit wir nicht alle Kunden in der Shop-DB haben sondern nur die die sich auch wirklich mal eingeloggt haben.

Wir Menschen im Gitter helfen doch immer wieder gern :smiley: