
Einrichten der Drupal-Authentifizierung mit OAuth2 und OpenID Connect
In der Ära zunehmend verteilter Architekturen von Anwendungen und Webportalen besteht die Notwendigkeit, flexible Authentifizierungsmethoden bereitzustellen und dabei die Bequemlichkeit für den Benutzer aufrechtzuerhalten. Aus diesem Artikel lernen Sie, wie Sie einfach einen Authentifizierungsserver und eine Client-Anwendung in Drupal mit OAuth2 und OpenID Connect erstellen können.
Verteilte Systeme, deren Skalierung und Wartung sind ein Problem für viele Kunden, die zu unserem Unternehmen kommen, um die Drupal-Beratung in Anspruch zu nehmen. Sehr oft besteht die Notwendigkeit, ein zentrales Anmeldesystem für alle Plattformen einer größeren Website-Föderation zu implementieren. Große Unternehmen und Organisationen haben separate Portale – wir haben viele Male Image-Aufbau-Websites, Intranet-Systeme und Drupal Commerce-Dienste für sie erstellt und dabei verschiedene Funktionen berücksichtigt. Die Notwendigkeit, ein separates Konto zu registrieren und sich an jedem einzelnen Ort separat anzumelden, erscheint als eine archaische Art, mit dem Problem umzugehen. Schließlich erleichtert sich kaum jemand von uns den täglichen Registerprozess auf Websites – zum Beispiel durch schnelle Registrierungsverfahren mittels eines Kontos in einem sozialen Netzwerk oder eines Google-Profils.
Warum nicht das Gleiche tun, besonders da – wie sich in einem Moment herausstellen wird – die Verwendung von Drupal hierfür sehr einfach ist.
OAuth2 und OpenID Connect
Um ein wenig Licht auf das gesamte Problem zu werfen, sollte man sich zunächst auf die im Allgemeinen in Webanwendungen verwendeten Standards konzentrieren, die im Authentifizierungsprozess verwendet werden.
Der erste ist OAuth2, ein offener Standard für Autorisierung, der kein Teilen von Authentifikatoren zwischen Anwendungen erfordert. Der Zugriff auf Ressourcen (falls gewährt) wird basierend auf einem Token verifiziert, das von dem Autorisierungsserver an die Client-Anwendungen ausgegeben wurde.
Da OAuth2 mit der Autorisierung entwickelt wurde, das heißt – mit der Gewährung spezifischen Zugriffs auf gegebene Ressourcen, ist es nicht direkt für einen Standard-Benutzer-Authentifizierungsprozess (Anmeldung) vorgesehen. Zu diesem Zweck wurde entschieden, eine zusätzliche (Authentifizierungs-)Schicht zum OAuth2-Protokoll vorzuschlagen, die diesen genauen Prozess standardisiert. Diese Technologie nennt sich OpenID Connect und – zusätzlich zum Anmeldeprozess – vereinheitlicht sie auch die Methode des Austauschs von Benutzerprofildaten zwischen Anwendungen. Wir werden daher untersuchen, wie beide Technologien in der Praxis eingesetzt werden können.
Installation der Module
Wenn Sie sowohl den auf OAuth2 basierenden Authentifizierungsserver als auch die auf OpenID Connect basierenden Client-Anwendungen in Drupal einrichten möchten, können Sie im Grunde genommen fertige Lösungen verwenden. Im Fall eines Servers haben Sie mehrere geeignete Module, einschließlich des bekanntesten (simple_oauth). In unserem Beispiel werden wir das OAuth2 Server Modul verwenden. Es ist etwas weniger bekannt und wurde noch nicht als stabile Version für Drupal 8 und 9 veröffentlicht, aber es wird von bedeutenden Unternehmen und Organisationen rund um Drupal unterstützt.
Zusätzlich wird das zweite Client-Anwendungsmodul, OpenID Connect, von den genau gleichen Organisationen und dem gleichen Entwicklungsteam gewartet und entwickelt. Sie können daher sicher sein, dass beide Projekte gleichzeitig weiterentwickelt werden und keine Probleme mit ihrer Kompatibilität zu einem späteren Zeitpunkt auftreten werden.
Die Installation der Module ist standardmäßig. Zuerst müssen Sie die Module auf unserem Server herunterladen und installieren:
composer require drupal/oauth2_server
drush en oauth2_server -y && drush cr
Dann auf ähnliche Weise – für den Client:
composer require drupal/openid_connect
drush en openid_connect -y && drush cr
Die Hauptabhängigkeit, die zur Installation des Servers benötigt wird, ist die oauth2-server-php Bibliothek, die die grundlegenden Mechanismen bereitstellt, um diese Rolle zu erfüllen. Wenn Sie Composer in PHP verwenden, werden alle Abhängigkeiten automatisch für Sie gelöst.
Serverkonfiguration
Die Konfiguration des OAuth2 Server Moduls basiert größtenteils auf Entitäten. Daher gehören zu den bereitgestellten Dingen die Entität des Servers, des Clients, des Tokens usw. Unsere Konfiguration muss mit der Definition des Servers beginnen. Also gehen wir zur Konfigurationsseite /admin/structure/oauth2-servers.
Und fügen einen neuen Server hinzu (Add Server). Im nächsten Schritt sehen wir das Server-Entitätenformular:
Im einfachsten Konfigurationsvariante lassen wir alle standardmäßig ausgewählten und ausgefüllten Werte unverändert. Zusätzlich aktivieren wir die Option "Use OpenID Connect" als Standard-Schicht im Anmeldeprozess.
Wie Sie an den Einstellungen sehen können, erfolgt der Authentifizierungs- und Autorisierungsprozess ohne die Verwendung von Authentifizierungsdaten, die vom Client gesendet werden, sondern basierend auf einem Autorisierungscode – später ausgetauscht gegen das Zugriffstoken und den Auffrischungstoken, die während der Kommunikation zwischen den Anwendungen ausgetauscht werden. Die technischen Details des OAuth2-Protokolls gehen über den Rahmen dieses Artikels hinaus, daher können Sie, wenn Sie mehr darüber erfahren möchten, wie die einzelnen Optionen und das Protokoll selbst funktionieren, die offizielle Dokumentation verwenden.
Im nächsten Schritt sollten wir die Clients definieren, die sich mit unserem Server verbinden können. Wir müssen jedoch mindestens eine Client-Anwendung haben, um dies tun zu können.
Konfiguration des Clients
OpenID Connect ist auch in Bezug auf die Einrichtung ein sehr benutzerfreundliches Modul. Um die Clients zu konfigurieren, die Sie verwenden möchten, gehen Sie zu /admin/config/services/openid-connect.
Wie Sie sehen können, gibt es im Formular eine Liste der Clients. Das Modul ermöglicht Ihnen daher, sich einfach mit beispielsweise bekannten sozialen Netzwerken anzumelden. Jeder Typ von Client ist als separates Plugin definiert (OpenIDConnectClient), was es einfach macht, das Projekt mit komplett neuen Clients zu erweitern. Unser Beispiel dreht sich jedoch um die Verbindung zu unserem eigenen Server, daher verwenden wir den Client für generische Zwecke (Generic).
Die Konfiguration ist ziemlich einfach, da sie darin besteht, den Namen des Clients und den sogenannten geheimen Schlüssel zu definieren sowie die Serveradressen anzugeben:
Während wir dabei sind, fügen wir eine kleine Verbesserung hinzu, nämlich – wir ersetzen das Anmeldeformular durch einen Login-Button, der unseren Autorisierungsserver verwendet. Dies ist sehr einfach und direkt aus dem Konfigurationsformular zugänglich:
Großartig! Der Client scheint einsatzbereit zu sein. Der einzige Nachteil ist die fehlende bequeme Option, den Namen von "Generic" ohne ein wenig Codierung zu ändern, aber das Ergebnis sieht trotz einer solch schnellen Einrichtung immer noch gut aus:
Serverkonfiguration Teil zwei
Wir haben einen vorkonfigurierten Server sowie einen einsatzbereiten Client. Lassen Sie uns also unseren Client in der Serverkonfiguration definieren, damit er weiß, dass er sich mit ihm verbinden und Zugang zu dessen Ressourcen anfordern kann. Drupal ist ein sehr sicheres CMS im Vergleich zur Konkurrenz, aber die Sicherheit basiert auch auf dessen korrekter Konfiguration.
Denken Sie immer daran, dass es an Ihnen liegt zu überprüfen und zu konfigurieren, welche Client-Anwendungen sich mit dem Server verbinden und dessen Ressourcen nutzen können sollen.
Um neue Clients hinzuzufügen, gehen Sie zum Clients-Tab und klicken dann auf die Schaltfläche, um neue Clients hinzuzufügen.
Sie sollten ein Formular sehen, dessen Daten auf die gleiche Weise ausgefüllt werden müssen, wie Sie es im OpenID Connect Modul in der Client-Anwendung eingerichtet haben.
Wir speichern das Formular, und es ist bereit... fast. Sie müssen immer noch die entsprechenden Berechtigungen erteilen, damit es überhaupt möglich ist, den OAuth2-Server zu verwenden. Gehen Sie dazu zur Seite /admin/people/permissions und weisen Sie die Berechtigung Use OAuth2 Server dem anonymen Benutzer zu.
Test
Alles ist bereit. Also lassen Sie uns das tatsächliche Anmeldeszenario überprüfen. Zuerst registrieren wir den Test-Benutzer auf unserem Server, damit er sich in unsere anderen Anwendungen einloggen kann.
Gehen Sie zur Client-Anwendung (Anmeldeformular) und klicken Sie auf den Log in with Generic-Button (Formular-Screenshot).
Sie werden auf die Anmeldeseite des Servers mit dem Zielparameter destination weitergeleitet (/user/login?Destination=/oauth2/authorise).
Nach korrekter Eingabe des Logins und des Passworts (test:test) sollten Sie diesen zusätzlichen Schritt sehen...
...in dem Sie als Anmeldebenutzer entscheiden, ob Sie unsere Client-Seite tatsächlich für Ihre Benutzerdaten vom Server autorisieren möchten, auf deren Grundlage ein lokales Benutzerkonto erstellt wird.
Nach der Genehmigung werden Sie als angemeldeter Benutzer zur Seite der Client-Anwendung weitergeleitet:
Erfolg! Wir können nun unser zentrales Anmeldesystem in vollem Umfang genießen.
Zusammenfassung
Die Möglichkeit, ein zentrales Anmeldesystem zu erstellen, ist ein zunehmend häufig anzutreffendes Bedürfnis bei den Kunden, die verschiedene Arten von verteilten Diensten, Websites und Anwendungen haben. Durch die Wahl von Drupal können Sie sich auf die Implementierung spezifischer Geschäftsregeln konzentrieren, anstatt das Rad neu zu erfinden. Die Verwendung der fertigen Lösungen, wie dem OAuth2 Server oder OpenIDConnect, unterstützt von bekannten Organisationen, gibt Ihnen die Sicherheit, dass Sie den benötigten Mechanismus leicht implementieren können – selbst ohne detaillierte Kenntnisse der verwendeten Protokolle.
In unserer Drupal-Agentur verwenden wir immer die bereits verfügbaren Lösungen, die wir häufig erweitern, und passen Drupal-Module an das spezifische Geschäftsmodell an. Ich hoffe, dass der obige Artikel und die verwendeten Module sich auch in Ihrem Projekt als nützlich erweisen werden.