Add-On: JWT SSO

Add-On: JWT SSO

Die PRINT LOUNGE kann von externen Systemen ein JWT (externer Link) erhalten und damit eine automatische Benutzeranmeldung über SSO durchführen. Dieses JWT muss den Parameter bid enthalten, der die BusinessId des anzumeldenden Benutzers enthält. Diese ID wird als temporärer Benutzername innerhalb der PRINT LOUNGE verwendet.

Der Benutzer wird gegen ein externes System verifiziert und weitere Metainformationen werden abgefragt. Anschließend werden die Benutzerstammdaten von einem weiteren Endpunkt des externen Systems abgerufen. Die Authentifizierung gegenüber dem externen System erfolgt mittels OAuth.

Modulabhängigkeiten

Dieses Modul kann nur in Verbindung mit dem bestehenden Modul "SSO" verwendet werden. Innerhalb der SSO-Einstellungen in den Shop-Einstellungen können u.a. Einstellungen zur Benutzeranlage vorgenommen werden.

Das Modul ist mit dem OCI-Workflow kompatibel, so dass eine abschließende Übergabe des Warenkorbs an das externe / führende System erfolgen kann.

Konfiguration des Moduls

Bei der Einrichtung des Moduls können alle Einstellungen shopbezogen hinterlegt werden:

Einstellung

Beschreibung

Einstellung

Beschreibung

Schnittstelle aktivieren

Das Modul – und somit die Anmeldung mittels JWT – kann mit dieser Einstellung aktiviert und deaktiviert werden.

JWT Secret / Shared Key

Zur Entschlüsselung und / oder Prüfung der Signatur ist das Secret bzw. der Shared Key erforderlich. Nur mit einem gültigen JWT kann eine Benutzeranmeldung erfolgreich durchgeführt werden.

Aktive Systemumgebung

Über diese Einstellung wird festgelegt, auf welche Umgebung zugegriffen werden soll. Hierbei stehen grundsätzlich 2 Systemumgebungen zur Verfügung:

  1. Entwicklungsumgebung

  2. Produktivumgebung

Beim Wechsel der aktiven Systemumgebung werden nur noch die Einstellungen der ausgewählten Umgebung angezeigt, um fehlerhafte Eingaben zu verhindern.

Einstellungen für die Ermittlung von Benutzerinformationen

Diese Einstellungen können jeweils pro Systemumgebung separat hinterlegt werden.

OAuth Client-ID

Diese Einstellung enthält die CLIENT_ID des OAuth-Services.

OAuth Client-Secret

Diese Einstellung enthält den CLIENT_SECRET des OAuth-Services.

Authorizierungsservice

URL des Authorisierungsservice (bspw. https://sap.lead-print.com/auth/protocol/openid-connect/auth)

Dieser Service muss ein gültiges Authorisierungsergebnis im OAuth-Standard zurückgeben. Anschließend wird der Benutzer zur Tokenabfrage in der PRINT LOUNGE weitergeleitet.

Tokenservice

URL des Authorisierungsservice (bspw. https://sap.lead-print.com/auth/protocol/openid-connect/auth)

Dieser Service muss ein gültiges AccessToken im OAuth-Standard oder einen entsprechenden HTTP-Statuscode zurückgeben. Im Anschluss werden die Benutzerstammdaten abgefragt und der Benutzer in der PRINT LOUNGE angemeldet.

Metadatenservice

URL des Metadatenservice, welcher grundlegende Informationen zu dem angefragten Benutzer zurückgeben kann.

Benutzerstammdatenservice

URL des Metadatenservice, welcher alle erforderlichen Stammdaten zu dem angefragten Benutzer zurückgeben kann.

Rücksprung und Warenkorbübergabe

OCI-Rückgabe-URL

URL für die Übergabe des Warenkorbs im OCI-Standard (optional)

Um diese Funktion nutzen zu können, muss die OCI-Anbindung konfiguriert werden.

Weiterleitung bei fehlgeschlagenem Login

URL für die Weiterleitung bei einem fehlgeschlagenen Login, sofern eine Anmeldung des Benutzers nicht möglich ist (bspw. aufgrund eines ungültigen JWT).

Wird keine URL hinterlegt, wird der Benutzer automatisch auf die Startseite des Shop-Systems weitergeleitet.

Der Sprung in das System erfolgt über /shop/module/JwtSso/Shop/authorize, um den Authorisierungsprozess zu starten.

Technischer Ablauf des Add-Ons

Der Endnutzer klickt auf "Login via SSO" im externen System. Die SAP-Nummer und ggf. Budgetgruppe werden an die PRINT LOUNGE übergeben. Der Nutzer wird zum Identity Provider (OAuth / SSO-Server) weitergeleitet. Dort meldet er sich an, der Identity Provider erstellt automatisch ein JWT und leitet den Benutzer zurück.

Der Shop empfängt den JWT (Authorization Code / Access Token). JWT wird entschlüsselt und liefer die Basisinformationen über den Nutzer (Name, E-Mail, persönliche IDs).

Erweiterte Nutzerinformationen werden von der Metadata API geholt (Rolle, Position, Business-ID, Locale usw.).

Kunden- und Adressinformationen werden von der Customer API geholt (Firmenname, Adresse, Kontaktperson, Telefonnummern usw.)

Alle Informationen werden zusammengeführt und in der PRINT LOUNGE wird ein Benutzer-Objekt erstellt, das alle relevanten Daten enthält. Optional werden benutzerdefinierte Felder (Custom Attributes) aus der Customer API übernommen.

Mit diesem CustomerUser wird der Nutzer zurück in den Shop weitergeleitet und angemeldet.

Hinweise und Voraussetzungen zu den externen APIs (Metadata und Customer API)

  • Beide APIs werden mit dem JWT Access Token authentifiziert.

  • Metadata API liefert erweiterte User-Infos, Customer API liefert kunden- und adressbezogene Daten.

  • Die Daten aus beiden Quellen werden anschließend im CustomerUser Objekt zusammengeführt.

  • Optional: Custom Attributes aus Customer API werden in dynamicUserFields gespeichert.

Beispieldefinition der Metadata API (extern)

Die Metadata API liefert erweiterte User-Informationen wie Rolle, Position, locale, Business-ID usw.

Request (Beispiel):

GET /api/user/metadata Host: sso.example.com Authorization: Bearer <JWT_ACCESS_TOKEN> Content-Type: application/json

Parameter:

  • Authorization → Bearer Token vom Identity Provider

  • Keine weiteren Query-Parameter nötig

Beispiel-Payload (Response):

{ "role": "Sales Manager", "position": "Key Account", "businessId": "BIZ12345", "preferred_username": "jdoe", "given_name": "John", "family_name": "Doe", "email": "john.doe@example.com", "email_verified": true, "locale": "de_DE", "unitIdentifier": "UNIT123", "personal_number": "123456", "fullName": "John Doe" }

Wird verwendet für CustomerUser-Felder wie:

  • typeposition

  • customFields[]role, businessId, firstName, lastName, locale, email

  • emailAddress / customer_user_emailemail

  • unitIdentifierunitIdentifier

Beispieldefinition der Customer API (CRM / extern)

Die Customer API liefert kunden- und adressbezogene Informationen, Firmen- und Kontaktinfos, sowie Custom Attributes.

Request (Beispiel):

GET /api/customers/{customerNumber} Host: crm.example.com Authorization: Bearer <JWT_ACCESS_TOKEN> Content-Type: application/json

Parameter:

  • customerNumber → SAP-/Kundennummer

  • Authorization → Bearer Token

  • Optional: Filter auf customAttributes oder address

Beispiel-Payload (Response):

{ "customerNumber": "CUST00123", "name": "Example GmbH", "name2": "Example Sales", "contactPerson": "Jane Smith", "address": { "title": "Dr.", "firstName": "John", "lastName": "Doe", "street": "Musterstraße 1", "zipCode": "12345", "city": "Musterstadt", "state": "Bayern", "country": { "iso2Code": "DE" } }, "phoneNumber": "+49 123 456789", "phoneNumber2": "+49 123 987654", "faxNumber": "+49 123 555555", "group": { "id": "G01", "displayName": "Hauptkunden" }, "channel": { "id": "C01", "displayName": "Online Sales" }, "classification": { "id": "CLASS01" }, "customAttributes": [ { "meta": { "name": "preferredContactTime" }, "value": "Morning" }, { "meta": { "name": "vipStatus" }, "value": "Gold" } ] }

Wird verwendet für CustomerUser-Felder wie:

  • firstName, lastName, customer_firstname, customer_lastnameaddress.firstName / lastName

  • company1, company2name / name2

  • longName, customer_longnamecontactPerson

  • address, zipCode, city, state, countryaddress Objekt

  • phoneNumber, mobileNumber, faxNumberphoneNumber / phoneNumber2 / faxNumber

  • function, branch, codegroup / channel / classification

  • dynamicUserFieldscustomAttributes

Datenherkunft und Mapping

CustomerUser Feld

Quelle (Bereich)

Feld aus Quelle

Beschreibung / Hinweise

CustomerUser Feld

Quelle (Bereich)

Feld aus Quelle

Beschreibung / Hinweise

userName

Request

sapNumber

SAP-/Kundennummer vom Frontend

externalSales

JWT

given_name + family_name

Anzeigename: Vorname + Nachname

type

Metadata API

position

Position / Rolle des Benutzers

company1

Customer API

customerData->name

Firmenname

company2

Customer API

customerData->name2

Zusatzname

title

Customer API

customerData->address->title

Anrede / Titel

firstName

Customer API

customerData->address->firstName

Vorname (CRM)

customer_firstname

Customer API

customerData->address->firstName

Duplikat von firstName

lastName

Customer API

customerData->address->lastName

Nachname (CRM)

customer_lastname

Customer API

customerData->address->lastName

Duplikat von lastName

longName

Customer API

customerData->contactPerson

Kontaktperson

customer_longname

Customer API

customerData->contactPerson

Duplikat von longName

address

Customer API

customerData->address->street

Straße

zipCode

Customer API

customerData->address->zipCode

Postleitzahl

city

Customer API

customerData->address->city

Ort

state

Customer API

customerData->address->state

Bundesland

country

Customer API

customerData->address->country->iso2Code

Ländercode

phoneNumber

Customer API

customerData->phoneNumber

Telefon

mobileNumber

Customer API

customerData->phoneNumber2

Mobil

faxNumber

Customer API

customerData->faxNumber

Fax

customerNumber

Customer API

customerData->customerNumber

Kundennummer; Fallback: Request → sapNumber

function

Customer API

customerData->group->id + displayName

Kundengruppe

branch

Customer API

customerData->channel->id + displayName

Vertriebskanal

code

Customer API

customerData->classification->id

Klassifizierung

emailAddress

Metadata API

userMetaData->email

E-Mail-Adresse; Fallback: JWT -> email

customer_user_email

Metadata API

userMetaData->email

Duplikat von emailAddress

customFields[1]

Metadata API

role

Benutzerrolle

customFields[2]

Metadata API

businessId

Business-ID

customFields[3]

JWT

name

Vollständiger Name

customFields[4]

JWT

personal_number

Personalnummer

customFields[5]

Metadata API

firstName

Vorname

customFields[6]

Metadata API

locale

Sprache / Locale

customFields[7]

Metadata API

lastName

Nachname

customFields[8]

Metadata API

email

E-Mail-Adresse

dynamicUserFields

Customer API

customAttributes

Frei definierte Attribute