Slack #uaa
Die UAA ist ein Multi-Tenant-Identitätsverwaltungsdienst, der in Cloud Foundry verwendet wird, aber auch als eigenständiger OAuth2-Server verfügbar ist. Seine Hauptaufgabe besteht darin, als OAuth2-Anbieter Token für Clientanwendungen auszugeben, die diese verwenden, wenn sie im Namen von Cloud Foundry-Benutzern agieren. Es kann Benutzer auch mit ihren Cloud Foundry-Anmeldeinformationen authentifizieren und mit diesen (oder anderen) Anmeldeinformationen als SSO-Dienst fungieren. Es verfügt über Endpunkte zur Verwaltung von Benutzerkonten und zur Registrierung von OAuth2-Clients sowie verschiedene andere Verwaltungsfunktionen.
Der Authentifizierungsdienst ist uaa
. Es ist eine einfache Spring MVC-Webanwendung. Stellen Sie es wie gewohnt in Tomcat oder einem Container Ihrer Wahl bereit oder führen Sie ./gradlew run
aus, um es direkt aus uaa
-Verzeichnis im Quellbaum auszuführen. Bei der Ausführung mit Gradle überwacht es Port 8080 und die URL lautet http://localhost:8080/uaa
Der UAA-Server unterstützt die im UAA-APIs-Dokument definierten APIs. Zusammenfassend:
Die OAuth2-Endpunkte /oauth/authorize und /oauth/token
Ein /login_info-Endpunkt, der die Abfrage erforderlicher Anmeldeaufforderungen ermöglicht
Ein /check_token-Endpunkt, der es Ressourcenservern ermöglicht, Informationen über ein von einem OAuth2-Client übermitteltes Zugriffstoken abzurufen.
Ein /token_key-Endpunkt, der es Ressourcenservern ermöglicht, den Verifizierungsschlüssel zur Überprüfung von Tokensignaturen abzurufen
SCIM-Benutzerbereitstellungsendpunkt
OpenID-Verbindungsendpunkte zur Unterstützung der Authentifizierung /userinfo. Teilweise OpenID-Unterstützung.
Die Authentifizierung kann von Befehlszeilen-Clients durchgeführt werden, indem Anmeldeinformationen direkt an den /oauth/authorize
-Endpunkt übermittelt werden (wie im UAA-API-Dokument beschrieben). Es gibt einen ImplicitAccessTokenProvider
in Spring Security OAuth, der die schwere Arbeit erledigen kann, wenn Ihr Client Java ist.
Authentifizieren
GET /login
Eine einfache Formular-Anmeldeschnittstelle.
Genehmigen Sie die OAuth2-Token-Gewährung
GET /oauth/authorize?client_id=app&response_type=code...
Standard-OAuth2-Autorisierungsendpunkt.
Zugriffstoken erhalten
POST /oauth/token
Standard-OAuth2-Autorisierungsendpunkt.
Anforderungen:
Wenn das funktioniert, sind Sie im Geschäft:
$ git clone git://github.com/cloudfoundry/uaa.git
$ cd uaa
$ ./gradlew run
Die Apps funktionieren alle zusammen mit den Apps, die auf demselben Port (8080) wie /uaa
, /app
und /api
laufen.
UAA protokolliert in einer Datei namens uaa.log
, die mit dem folgenden Befehl gefunden werden kann:
$ sudo lsof | grep uaa.log
was Sie unter etwas finden sollten wie:-
$TMPDIR/cargo/conf/logs/
Führen Sie zunächst den UAA-Server wie oben beschrieben aus:
$ ./gradlew run
Von einem anderen Terminal aus können Sie mit Curl überprüfen, ob UAA gestartet wurde, indem Sie Systeminformationen anfordern:
$ curl --silent --show-error --head localhost:8080/uaa/login | head -1
HTTP/1.1 200
Bei komplexen Anfragen ist es bequemer, mit UAA über uaac
, den UAA-Befehlszeilenclient, zu interagieren.
Um den JDWP-Agenten für das UAA-JVM-Debugging zu laden, starten Sie den Server wie folgt:
./gradlew run -Dxdebug=true
oder
./gradlew -Dspring.profiles.active=default,hsqldb,debug run
Anschließend können Sie Ihren Debugger an Port 5005 des JVM-Prozesses anschließen.
Um den Serverstart auszusetzen, bis der Debugger angeschlossen ist (nützlich zum Debuggen von Startcode), starten Sie den Server wie folgt:
./gradlew run -Dxdebugs=true
oder
./gradlew -Dspring.profiles.active=default,hsqldb,debugs run
./gradlew run
führt den UAA-Server standardmäßig mit der hsqldb-Datenbank aus.
% docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=changeme -d -p3306:3306 mysql
uaa
Datenbank (z. B. in einer interaktiven MySQL-Sitzung). % mysql -h 127.0.0.1 -u root -p
...
mysql > create database uaa ;
% ./gradlew -Dspring.profiles.active=mysql,default run
docker run --name postgres1 -p 5432:5432 -e POSTGRES_PASSWORD=mysecretpassword -d postgres
uaa
Datenbank (z. B. in einer interaktiven PSQL-Sitzung). % psql -h 127.0.0.1 -U postgres
create database uaa;
create user root with superuser password 'changeme';
% ./gradlew -Dspring.profiles.active=postgresql,default run
c uaa
psql (14.5 (Homebrew), server 15.0 (Debian 15.0-1.pgdg110+1))
WARNING: psql major version 14, server major version 15.
Some psql features might not work.
You are now connected to database "uaa" as user "postgres".
d
List of relations
Schema | Name | Type | Owner
--------+-------------------------------+----------+-------
public | authz_approvals | table | root
public | expiring_code_store | table | root
public | external_group_mapping | table | root
public | external_group_mapping_id_seq | sequence | root
public | group_membership | table | root
public | group_membership_id_seq | sequence | root
public | groups | table | root
public | identity_provider | table | root
public | identity_zone | table | root
public | oauth_client_details | table | root
public | oauth_code | table | root
public | oauth_code_id_seq | sequence | root
public | revocable_tokens | table | root
public | schema_version | table | root
public | sec_audit | table | root
public | sec_audit_id_seq | sequence | root
public | spring_session | table | root
public | spring_session_attributes | table | root
public | user_info | table | root
public | users | table | root
(23 rows)
Sie können die Integrationstests mit Docker ausführen
$ run-integration-tests.sh <dbtype>
erstellt einen Docker-Container mit uaa + ldap + Datenbank, für den Integrationstests ausgeführt werden.
Die Standard-UAA-Einheitentests (./gradlew test integrationTest) verwenden hsqldb.
So führen Sie die Unit-Tests mit Docker aus:
$ run-unit-tests.sh <dbtype>
Die Standard-UAA-Einheitentests ( ./gradlew test
) verwenden hsqldb.
Finden Sie zunächst heraus, zu welchem Gradle-Projekt Ihr Test gehört. Sie können alle Projekte finden, indem Sie sie ausführen
$ ./gradlew projects
Um eine bestimmte Testklasse auszuführen, können Sie das Modul und die Testklasse angeben.
$ ./gradlew :<project name>:test --tests <TestClass>.<MethodName>
In diesem Beispiel werden nur die JdbcScimGroupMembershipManagerTests-Tests im Modul cloudfoundry-identity-server ausgeführt:
$ ./gradlew :cloudfoundry-identity-server:test
--tests "org.cloudfoundry.identity.uaa.scim.jdbc.JdbcScimGroupMembershipManagerTests"
oder um alle Tests in einer Klasse auszuführen
$ ./gradlew :<project name>:test --tests <TestClass>
Möglicherweise möchten Sie den vollständigen Gradle-Befehl verwenden, der sich am Ende des Skripts scripts/unit-tests.sh
befindet, indem Sie dem test
den Projektnamen voranstellen und die Option --tests
hinzufügen.
$ ./gradlew :clean :assemble -Pversion=${UAA_VERSION}
Hier gibt es tatsächlich mehrere Projekte, die Haupt- uaa
-Serveranwendung, eine Client-Bibliothek und einige Beispiele:
uaa
ein WAR-Projekt für eine einfache Bereitstellung
server
ein JAR-Projekt, das die Implementierung der REST-API (einschließlich SCIM) und der Benutzeroberfläche von UAA enthält
model
ein JAR-Projekt, das sowohl von der Clientbibliothek als auch vom Server verwendet wird
api
(Beispiel) ist ein OAuth2-Ressourcendienst, der eine Scheinliste der bereitgestellten Apps zurückgibt
app
(Beispiel) ist eine Benutzeranwendung, die beide oben genannten Funktionen verwendet
In CloudFoundry-Begriffen
uaa
bietet einen Authentifizierungsdienst sowie eine autorisierte Delegation für Back-End-Dienste und Apps (durch die Ausgabe von OAuth2-Zugriffstokens).
api
ist ein Dienst, der Ressourcen bereitstellt, auf die andere Anwendungen möglicherweise im Namen des Ressourceneigentümers (des Endbenutzers) zugreifen möchten.
app
ist eine Webanwendung, die im Namen der Benutzer eine einmalige Anmeldung und Zugriff auf den api
-Dienst erfordert.
Voraussetzungen
Die Kubernetes-Bereitstellung befindet sich in der aktiven Entwicklung. Sie sollten mit häufigen (und möglicherweise bahnbrechenden) Änderungen rechnen. Dieser Abschnitt wird aktualisiert, sobald Fortschritte bei diesem Funktionsumfang erzielt werden. Ab sofort:
Das K8s-Verzeichnis enthält ytt
Vorlagen, die gerendert und auf einen K8s-Cluster angewendet werden können.
In der Entwicklung kann dieses Makefile für allgemeine Rendering- und Bereitstellungsaktivitäten verwendet werden.
In der Produktion möchten Sie ytt höchstwahrscheinlich direkt verwenden. Etwas in der Art sollte Ihnen den Einstieg erleichtern:
$ ytt -f templates -f values/default-values.yml | kubectl apply -f -
Wenn Sie einige dieser Werte überschreiben möchten, können Sie dies tun, indem Sie die Überlagerungsfunktion von YTT nutzen.
$ ytt -f templates -f values/default-values.yml -f your-dir/production-values.yml | kubectl apply -f -
Natürlich können Sie jederzeit ganz auf die Standardwerte verzichten und Ihre eigene Wertedatei bereitstellen.
Hier sind einige Möglichkeiten für Sie, sich in der Community zu engagieren:
Anforderungen:
Zum Debuggen von UAA- und LDAP-Integrationen verwenden wir ein OpenLdap-Docker-Image aus dem Bitnami-Projekt von VMWare
uaa/src/main/resources/uaa.yml
und aktivieren Sie LDAP, indem Sie Zeile 7, spring_profiles: ldap,default,hsqldb
auskommentierendocker-compose up
aus dem Verzeichnis scripts/ldap
ausscripts/ldap
aus die Konnektivität zum Ausführen des OpenLdap-Containers, indem Sie docker-confirm-ldapquery.sh
ausführen./gradlew run
/uaa
und melden Sie sich mit dem LDAP-Benutzer user01
und dem Passwort password1
anVerwenden Sie den folgenden Befehl, um Container und Volume zu bereinigen:
docker-compose down --volumes