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 |
|---|---|
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:
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 BenutzerinformationenDiese 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
dynamicUserFieldsgespeichert.
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 ProviderKeine 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:
type→positioncustomFields[]→role,businessId,firstName,lastName,locale,emailemailAddress/customer_user_email→emailunitIdentifier→unitIdentifier
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 TokenOptional: Filter auf
customAttributesoderaddress
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_lastname→address.firstName / lastNamecompany1,company2→name / name2longName,customer_longname→contactPersonaddress,zipCode,city,state,country→addressObjektphoneNumber,mobileNumber,faxNumber→phoneNumber / phoneNumber2 / faxNumberfunction,branch,code→group / channel / classificationdynamicUserFields→customAttributes
Datenherkunft und Mapping
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 | E-Mail-Adresse | |
dynamicUserFields | Customer API | customAttributes | Frei definierte Attribute |