Gelegentlich erreichen uns Entwickler Meldungen über Fehler im Magento 2 Shopsystem, welche scheinbar nur vereinzelte Kunden betreffen. Ist dies der Fall, muss schnell eine Ursache gefunden und der Fehler behoben werden, um den Shopbenutzer nicht zu verlieren.
Dass der Ursprung des Problems in der Datenbank gefunden werden kann, ist hier meist der erste Ansatz, doch umfasst eine normale Magento 2 Datenbank hunderte von Tabellen mit tausenden Datensätzen und in jedem einzelnen könnte ein falscher Wert stecken. Das einfachste Vorgehen wäre also, den Weg zum Fehler selbst am PC des zuständigen Entwicklers nachzustellen, doch benötigt man hierfür Zugriff auf das Kundenkonto.
Früher, zu Zeiten der ersten Version des Shopsystems Magento, war das eine recht einfache Sache. Im Fehlerfall steht man ohnehin im Kontakt mit dem Kunden, also ändert der Entwickler nach Rücksprache das Passwort über das Magento Backend und loggt sich nun mit den selbst angelegten Daten in den Kundenaccount ein. Mit dem Versionssprung auf Magento 2 wurde hier aber im Wohle der Sicherheit die Möglichkeit entfernt Kundenpasswörter zu vergeben. Das zurücksetzen kann zwar per E-Mail Token veranlasst werden, doch müsste der Kunde hier selbst einschreiten, was im Ernstfall aber viel zu lange dauern würde. Auch mit Zugriff auf die Datenbank und Komandozeilen-Tools auf dem Server ist das Passwort nicht zu Ändern, da es Magento intern verschlüsselt und so gespeichert wird.
Unser Ziel war also, einen Weg zu finden, eine Sitzung als eingeloggter Kunde starten zu können, ohne dessen Anmeldedaten zu kennen. Natürlich steht auch hier die Sicherheit an erster Stelle, was bedeutet, dass wir sicherstellen müssen, dass kein Unbefugter unsere „Hintertür“ ausnutzen kann, um sich Zugriff auf fremde Accounts verschaffen zu können.
Modulvorstellung: flagbit/magento2-virtual-customer-session
Zu Beginn des Projektes galt es herauszufinden, wie Magento selbst Kundensitzungen verwaltet. Klar – die Sitzung wird bei jedem Seitenaufruf über Werte in Cookies und Sitzungsvariablen initialisiert. Doch wie autorisiert Magento die Kunden? Es gibt einen Controller im Kunden Modul, welcher beim Login aufgerufen wird und E-Mail-Adresse sowie Passwort übergeben bekommt. Die Daten werden dann an eine Funktion übergeben, welche diese mit den Einträgen aus der Datenbank abgleicht und das Kunden-Model bzw. einen Fehler ausliefert. Danach wird das Kunden-Model in die Sitzungsvariable geschrieben und der Kunde ist somit eingeloggt.
Umsetzung
An der Stelle, an der die übergebenen Anmeldedaten mit der Datenbank verglichen werden, haben wir die Möglichkeit das Kunden-Model auf einem anderen Weg über die ID oder die E-Mail-Adresse allein zu laden. Das bedeutet, dass wir kein Passwort mehr benötigen. In Folge können wir das Kunden-Model in die Sitzungsvariable schreiben,ohne vorher ein Passwort abgefragt zu haben.
Dies kann theoretisch an jeglicher Stelle im Code passieren. Am sinnvollsten wäre es allerdings in einem eigenen Controller, welcher bei bestimmten Seitenaufrufen ausgeführt wird oder in einem Observer, welcher bei jedem Seitenaufruf vor allen anderen Funktionalitäten greift. Für unser Modul habe ich mich für die zweite Variante entschieden. Kombiniert wird das ganze mit einem Service, welcher auf einen eigenen zusätzlichen Header im request lauscht. Dies gibt uns die Möglichkeit, eine Kundensitzung genau so lange zu simulieren, wie die Kunden E-Mail-Adresse beim Seitenaufruf als Header Wert übergeben wird. Header können in den gängigen Browsern wie Firefox, Chrome und Opera per Plug-Ins modifiziert oder hinzugefügt werden.
Sicherheit
Zum Datenschutz und um unbefugten Zugang zu Kundenkonten zu verhindern, ist das Modul intern an den Magento-Entwickler-Modus gekoppelt. Aktiviert ist dieser meist nur auf Entwicklungssystemen, welche ohnehin nicht öffentlich zugänglich sind oder auf Live Systemen mit einer IP Beschränkung, sodass man nur vom Netzwerk der Firma Flagbit oder wahlweise des Kunden auf die Entwicklerfunktionen zugreifen kann. Es ist somit nicht möglich, die Funktionalität von außen zu missbrauchen.
Technisches
Unser Modul flagbit/magento2-virtual-customer-session ist auf Github zu finden. Es ist kostenlos und jeder hat die Möglichkeiten per Pull-Request Änderungen vorzuschlagen.
Um eine Kundensitzung zu simulieren, muss der Request-Header DEBUG-CUSTOMER mit dem Wert der E-Mail Adresse des Kunden übergeben werden. Eine technische Anleitung und Links zu Browser-Plugins finden Sie in der Beschreibung auf Gitbub.
https://github.com/Flagbit/magento2-virtual-customer-session
Wenn Sie das Modul verwenden möchten, dann installieren Sie es am besten per composer. Das Paket ist in den offiziellen Quellen von Packagist zu finden.
https://packagist.org/packages/flagbit/magento2-virtual-customer-session
0 Kommentare