Slack #uaa
UAA — это служба управления идентификацией с несколькими арендаторами, используемая в Cloud Foundry, но также доступная как автономный сервер OAuth2. Его основная роль — поставщик OAuth2, выдающий токены для использования клиентскими приложениями, когда они действуют от имени пользователей Cloud Foundry. Он также может аутентифицировать пользователей с помощью их учетных данных Cloud Foundry и выступать в качестве службы единого входа, используя эти (или другие) учетные данные. Он имеет конечные точки для управления учетными записями пользователей и регистрации клиентов OAuth2, а также различные другие функции управления.
Служба аутентификации — uaa
. Это простое веб-приложение Spring MVC. Разверните как обычно в Tomcat или выбранном вами контейнере или запустите ./gradlew run
чтобы запустить его непосредственно из каталога uaa
в дереве исходного кода. При работе с gradle он прослушивает порт 8080, а URL-адрес http://localhost:8080/uaa
Сервер UAA поддерживает API, определенные в документе UAA-API. Подводя итог:
Конечные точки OAuth2 /oauth/authorize и /oauth/token
Конечная точка /login_info, позволяющая запрашивать необходимые запросы на вход в систему.
Конечная точка /check_token, позволяющая серверам ресурсов получать информацию о токене доступа, отправленном клиентом OAuth2.
Конечная точка /token_key, позволяющая серверам ресурсов получать ключ проверки для проверки подписей токенов.
Конечная точка подготовки пользователей SCIM
Конечные точки подключения OpenID для поддержки аутентификации/userinfo. Частичная поддержка OpenID.
Аутентификация может выполняться клиентами командной строки путем отправки учетных данных непосредственно в конечную точку /oauth/authorize
(как описано в документе UAA-API). В Spring Security OAuth есть ImplicitAccessTokenProvider
, который может выполнить тяжелую работу, если ваш клиент — Java.
Аутентификация
GET /login
Базовый интерфейс входа в форму.
Утвердить предоставление токена OAuth2
GET /oauth/authorize?client_id=app&response_type=code...
Стандартная конечная точка авторизации OAuth2.
Получить токен доступа
POST /oauth/token
Стандартная конечная точка авторизации OAuth2.
Требования:
Если это работает, вы в бизнесе:
$ git clone git://github.com/cloudfoundry/uaa.git
$ cd uaa
$ ./gradlew run
Все приложения работают вместе с приложениями, работающими на том же порту (8080), что и /uaa
, /app
и /api
.
UAA будет регистрироваться в файле uaa.log
, который можно найти с помощью следующей команды:
$ sudo lsof | grep uaa.log
который вы должны найти где-то вроде: -
$TMPDIR/cargo/conf/logs/
Сначала запустите сервер UAA, как описано выше:
$ ./gradlew run
Из другого терминала вы можете использовать Curl, чтобы убедиться, что UAA запущен, запросив системную информацию:
$ curl --silent --show-error --head localhost:8080/uaa/login | head -1
HTTP/1.1 200
Для сложных запросов удобнее взаимодействовать с UAA с помощью uaac
— клиента командной строки UAA.
Чтобы загрузить агент JDWP для отладки JVM UAA, запустите сервер следующим образом:
./gradlew run -Dxdebug=true
или
./gradlew -Dspring.profiles.active=default,hsqldb,debug run
Затем вы можете подключить отладчик к порту 5005 процесса jvm.
Чтобы приостановить запуск сервера до подключения отладчика (полезно для отладки кода запуска), запустите сервер следующим образом:
./gradlew run -Dxdebugs=true
или
./gradlew -Dspring.profiles.active=default,hsqldb,debugs run
./gradlew run
по умолчанию запускает сервер UAA с базой данных hsqldb.
% docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=changeme -d -p3306:3306 mysql
uaa
(например, в интерактивном сеансе MySQL). % 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
(например, в интерактивном сеансе psql) % 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)
Вы можете запустить интеграционные тесты с помощью Docker.
$ run-integration-tests.sh <dbtype>
создаст докер-контейнер с базой данных uaa + ldap +, для которого будут выполняться интеграционные тесты.
Модульные тесты uaa по умолчанию (./gradlew testintegrationTest) используют hsqldb.
Чтобы запустить модульные тесты с помощью Docker:
$ run-unit-tests.sh <dbtype>
Модульные тесты uaa по умолчанию ( ./gradlew test
) используют hsqldb.
Начните с выяснения, к какому проекту Gradle принадлежит ваш тест. Вы можете найти весь проект, запустив
$ ./gradlew projects
Чтобы запустить определенный класс теста, вы можете указать модуль и класс теста.
$ ./gradlew :<project name>:test --tests <TestClass>.<MethodName>
В этом примере выполняются только тесты JdbcScimGroupMembershipManagerTests в модуле cloudfoundry-identity-server:
$ ./gradlew :cloudfoundry-identity-server:test
--tests "org.cloudfoundry.identity.uaa.scim.jdbc.JdbcScimGroupMembershipManagerTests"
или запустить все тесты в классе
$ ./gradlew :<project name>:test --tests <TestClass>
Возможно, вы захотите использовать полную команду gradle, расположенную в нижней части сценария scripts/unit-tests.sh
, добавив имя проекта перед test
командой и добавив параметр --tests
.
$ ./gradlew :clean :assemble -Pversion=${UAA_VERSION}
На самом деле здесь несколько проектов, основное серверное приложение uaa
, клиентская библиотека и несколько примеров:
uaa
проект WAR для простого развертывания
server
проект JAR, содержащий реализацию REST API UAA (включая SCIM) и пользовательский интерфейс.
model
проект JAR, используемый как клиентской библиотекой, так и сервером
api
(образец) — это служба ресурсов OAuth2, которая возвращает макетный список развернутых приложений.
app
(пример) — пользовательское приложение, использующее оба вышеперечисленных
В терминах CloudFoundry
uaa
предоставляет службу аутентификации, а также авторизованное делегирование для серверных служб и приложений (путем выдачи токенов доступа OAuth2).
api
— это служба, предоставляющая ресурсы, к которым другие приложения могут захотеть получить доступ от имени владельца ресурса (конечного пользователя).
app
— это веб-приложение, которому требуется единый вход и доступ к службе api
от имени пользователей.
Предварительные условия
Развертывание Kubernetes находится в активной разработке. Вам следует ожидать частых (и, возможно, критических) изменений. Этот раздел будет обновляться по мере развития этого набора функций. На данный момент:
Каталог K8s содержит шаблоны ytt
, которые можно отобразить и применить к кластеру K8s.
В процессе разработки этот Makefile можно использовать для общих действий по рендерингу и развертыванию.
В рабочей среде вы, скорее всего, захотите использовать ytt напрямую. Что-то вроде этого должно помочь вам:
$ ytt -f templates -f values/default-values.yml | kubectl apply -f -
Если вы хотите переопределить некоторые из этих значений, вы можете сделать это, воспользовавшись функцией наложения YTT.
$ ytt -f templates -f values/default-values.yml -f your-dir/production-values.yml | kubectl apply -f -
Конечно, вы всегда можете вообще отказаться от значений по умолчанию и предоставить свой собственный файл значений.
Вот несколько способов принять участие в жизни сообщества:
Требования:
Для отладки интеграции UAA и LDAP мы используем образ докера OpenLdap из проекта VMWare Bitnami.
uaa/src/main/resources/uaa.yml
и включите LDAP, раскомментировав строку 7, spring_profiles: ldap,default,hsqldb
docker-compose up
из каталога scripts/ldap
scripts/ldap
проверьте подключение к запущенному контейнеру OpenLdap, запустив docker-confirm-ldapquery.sh
./gradlew run
/uaa
и войдите в систему, используя пользователя LDAP user01
и пароль password1
Используйте команду ниже для очистки контейнера и тома:
docker-compose down --volumes