Categories
Development

OneLogin

Ich setzte mich mit der cloudbasierten IAM Lösung OneLogin auseinander und möchte zum Einstieg deren simpelste Beispiel-Anwendung zum laufen bringen.

Die Entwicklerseite von OneLogin: OneLogin Developers: APIs, Documentation & Tutorials

OneLogin Developer Account erstellen

Auch für das einfachste Beispiel wird ein Account benötigt, hierzu kann ein kostenfreier Entwickler Account angelegt werden.

Ich habe mich dabei für den Domain Namen deringo-dev.onelogin.com entschieden.

Beispielanwendung

Am einfachsten scheint mir eine OpenID Connect basierte Javascript Anwendung zu sein, daher wähle ich aus den Samples die Single Page App heraus.

Zuerst Node.js updaten.

Projekt clonen und ausführen:

mkdir test
cd test
git clone https://github.com/onelogin/onelogin-oidc-node.git
cd '.\onelogin-oidc-node\2. Implicit Flow\'
npm install
--> npm ERR! Unexpected token '.'

Das fängt ja mal wieder gut an 🙁

nvm use 14.17.3
npm install

Mit der alten Version hat es dann funktioniert. 🙂

npm start

Die Anwendung lässt sich jetzt über http://localhost:3000/ aufrufen.

Es kommt natürlich ein Fehler, da die Anwendung noch nicht konfiguriert ist:

Application in OneLogin anlegen

Auf der OneLogin Seite (https://deringo-dev.onelogin.com/) unter Applications auf Add gehen und eine OpenId Connect App anlegen.

Name, Beschreibung und (schnell gemaltes) Square Icon vergeben und speichern.

Im darauf folgenden Screen ist mein Square Icon leider nicht mehr vorhanden. Dafür steht dort aber ein Feld Tab, in dem etwas steht, was dort definitiv nicht stehen sollte (Name eines Kunden, woher kommt das denn??)

Ich ignoriere das erstmal und notiere mir die Client ID unter SSO.

Ich muss noch die Redirect URI zu meiner App (http://localhost:3000) eintragen:

Anwendung konfigurieren

Die Client ID und meine OneLogin-Subdomain (deringo-dev) trage ich in der main.js ein.

//
// OIDC Client Configuration
//
const ONELOGIN_CLIENT_ID = 'geheim-a91c-013a-175a-02471d082b0b208817';
const ONELOGIN_SUBDOMAIN = 'deringo-dev';

Die Anwendung lässt sich über http://localhost:3000/ aufrufen:

Jetzt erscheint eine Login-Seite:

Ich kann mich mit meinen OneLogin-Developer-Zugangsdaten einloggen.

Das Ausloggen gestaltet sich bisher als unmöglich: Weder der Neustart des Servers, noch das Löschen des Local, bzw. Session Storages führt zum erneuten Login. Cookies sind keine gesetzt und können daher nicht gelöscht werden.

Über ein neues, anonymes Browserfenster lässt sich ein erneuter Login erzwingen.

Neuer User für die Beispielanwendung

Auf der OneLogin Seite (https://deringo-dev.onelogin.com/) unter Users auf New User gehen und einen neuen Benutzer anlegen.

First-, Last-, Username eingetragen.
Beispiel-App (SinglePageApp) hinzugefügt.

Ein Passwort lässt sich anscheinend nicht über die OneLogin Seite für den Benutzer setzen. Für die Passwort-Wiederherstellung wird eine Email-Adresse benötigt, das ist zumindest der einzig wählbare Authentifizierungsfaktor. Ich muss meinem neuen Benutzer auch eine Email Adresse vergeben.

Das nachträgliche setzen der Email Adresse hat nicht funktioniert. Ich habe dann einen weiteren neuen Benutzer angelegt, diesmal ohne Username, dafür aber mit Email Adresse.
Mit diesem Benutzer konnte ich dann das Passwort "Zurück"setzen lassen und mich anschließend einloggen.

Beispielanwendung 2

Nach dem Implicit flow, der nicht mehr empfohlen ist, schaue ich mir den Auth Code Flow + PKCE an, der als Best Practice gilt.

Aus dem bereits geclonten Git Repository ist das das 4. Projekt.

cd '.\4. Auth Flow - PKCE\'
npm install
npm start

Die Client ID und meine OneLogin-Subdomain (deringo-dev) trage ich in der main.js ein.

//
// OIDC Client Configuration
//
const ONELOGIN_CLIENT_ID = 'geheim-a91c-013a-175a-02471d082b0b208817';
const ONELOGIN_SUBDOMAIN = 'deringo-dev';

Die Anwendung lässt sich über http://localhost:3000/ aufrufen:

Der Login mit meinem Benutzer funktionierte problemlos.

Allerdings wurden anschließend auf der Sample Seite NICHT die Benutzer Daten angezeigt.

Ein Blick in die Console des Browsers zeigt den Fehler:

Da die minified Version des oidc-client.js nicht sonderlich leserlich ist, lade ich die nicht-minified Version herunter und speichere sie neben der minified Version im Projekt ab.

In der Datei index.hbs wird das oidc-client Script importiert, also passe ich dort die Referenz an.

Aber auch das debuggen mit der nicht-minified Version brachte keinen weiteren Erkenntnisgewinn.

Die Lösung fand sich schließlich in der OneLogin Konfiguration: Im SSO Teil der Applikation musste der Token Endpoint auf "None (PKCE)" umgestellt werden.