Integration Login in weitere Systeme (JWT, PHP Session)

Liebes OXID-Forum,

wir möchten dem weißen Kaninchen folgen und die neue GraphQL API von OXID für unser nächstes Projekt verwenden.

Die Idee: unsere Homepage (eine Lösung auf Basis von React und einem Headless CMS) soll besser mit unserem Webshop integriert werden.
Z. B. soll auf der Homepage ein Warenkorb-Symbol dargestellt werden, über das die Anzahl der Artikel dargestellt werden, die sich im Warenkorb befinden. Die Ermittlung der Anzahl der Warenkorbartikel erfolgt über GraphQL.

Der Webshop verwendet ein Design auf Basis von “Flow” und das Standard-Login Verfahren: Cookie und PHP-Session. Die Kommunikation zwischen Homepage und Webshop geschieht mit JWT.

Wie kann man erreichen, dass bei Login im Webshop, der Benutzer auch auf der Homepage eingeloggt wird (und umgekehrt)?

Moin @Daniel_Beck :slight_smile:

Indem das JWT Token vom CMS und Webshop über eine Schnittstelle kompatibel gemacht werden.

Dies geht in zwei Richtungen

  1. Man bringt dem CMS bei das JWT Token vom Webshop zu verstehen
  2. Man bringt dem Webshop bei das JWT Token vom CMS zu verstehen

Die GraphQL API von OXID ermittelt anhand des JWT Tokens den Benutzer. Die Struktur der JWT unterscheidet sich meistens wenn noch andere Systeme zum Einsatz kommen. Daher muss man es programmtechnisch lösen beide Token Strukturen zu verstehen und zu validieren ob Token nicht manipuliert wurde.

Für Punkt 2. müsste man dem Webshop über ein eigenes GraphQL Modul oder Service Erweiterung beibringen den Token vom CMS zu verarbeiten und darüber den Benutzer zuordnen zu können.

Fazit mindestens einer Partei CMS oder Webshop muss man beibringen den jeweils anderen Token zu verstehen und zu validieren.

Ergänzung

Der JWT Token über GraphQL API ist auch nur für die GraphQL Schnittstelle gedacht und nicht für den “normalen” Shop Betrieb welcher über die PHP Session läuft. Auch wenn die GraphQL API im Hintergrund noch PHP Sessions anlegt haben diese keine große Bewandtnis bei einer reinen GraphQL Frontend Lösung.

Zielführend in Eurem Fall wird dann wahrscheinlich Punkt 1. sein dem CMS bei zu bringen das Token vom Webshop zu verstehen und den Benutzer aus Webshop im CMS zuzuordnen oder ggfs. erst noch anzulegen.

Dort müsste man sich über die Datenhaltung Gedanken machen woher die Benutzerdaten kommen? Ob diese in beiden Systemen vorgehalten werden oder immer aus dem jeweils anderen System geladen werden sollen.

1 Like

Hi @indianer3c,

vielen Dank für deine Antwort! Das Szenario ist ein bisschen anders: das CMS selbst bietet keinen Kundenlogin, auf der Homepage (React-Anwendung) soll sich der Benutzer in den Webshop einloggen können. In dem Fall kann der Benutzer auf seine Kundendaten zugreifen und ist auch im Webshop eingeloggt. Es sind keine Kundendaten im CMS gespeichert.

Ich versuche mal, deine Antwort auf das beschriebene Szenario zu übertragen. Da das JWT Token nur für die GraphQL-API gedacht ist (wie in deiner Ergänzung erklärt), muss man das Authentifizierungsverfahren im Front-End und im Webshop anpassen:

  • Wenn der Benutzer sich im Webshop einloggt, soll der Webshop das normale Session-Cookie und ein JWT-Token zurück liefern. Das JWT-Token wird als Cookie gespeichert, damit die Homepage darauf zugreifen kann. Dadurch wäre der Benutzer im Webshop eingeloggt und kann über die Homepage auf seine Kundendaten und den Warenkorb mittels JWT zugreifen.
  • Wenn der Benutzer sich auf der Homepage einloggt, ruft das Frontend einen Webservice des Webshops auf (muss dann von uns entwickelt werden), der ein Session-Cookie und ein JWT-Credential zurück liefert. Dadurch wäre der Benutzer in beiden Systemen eingeloggt ist.

Ist das richtig so?

Hi @Daniel_Beck :slight_smile:

Ja, dies könnte eine Lösung darstellen, indem die Homepage prüft ob dieser Cookie gesetzt ist und wenn der JWT Token im Cookie Gültigkeit besitzt den Benutzer automatisch einloggt. Aber ob dies sicherheitstechnisch so klug ist weiß nicht. Würde zumindest die Gültigkeitsdauer von 8 Stunden in der Standard Einstellung vom JWT Token ggfs. auf 1 Stunde reduzieren.

Die token Query gibt es bereits, dort muss man aus meiner Sicht dem Webshop nichts neues beibringen. Im Prinzip müsst Ihr nur Eure Homepage die GraphQL API vom Webshop nutzen lassen um an die Daten aus dem Webshop zu kommen z.B. auf der Homepage eine normale Login Maske, welche nach abschicken im Hintergrund mit GraphQL API kommuniziert und sich halt die benötigten Daten holt etc.

Liest sich zumindest nach einem Plan, die Detailprobleme kommen meist bei der Umsetzung.