スラック#uaa
UAA はマルチテナント ID 管理サービスであり、Cloud Foundry で使用されますが、スタンドアロン OAuth2 サーバーとしても使用できます。その主な役割は、OAuth2 プロバイダーとして、クライアント アプリケーションが Cloud Foundry ユーザーに代わって動作するときに使用するトークンを発行することです。また、Cloud Foundry 資格情報を使用してユーザーを認証し、それらの資格情報 (またはその他) を使用して SSO サービスとして機能することもできます。ユーザー アカウントを管理し、OAuth2 クライアントを登録するためのエンドポイントや、その他のさまざまな管理機能があります。
認証サービスはuaa
です。これはプレーンな Spring MVC Web アプリです。 Tomcat または選択したコンテナーで通常どおりデプロイするか、 ./gradlew run
を実行してソース ツリーのuaa
ディレクトリから直接実行します。 Gradle で実行している場合、ポート 8080 でリッスンし、URL はhttp://localhost:8080/uaa
です。
UAA サーバーは、UAA-API ドキュメントで定義されている API をサポートします。要約すると:
OAuth2 /oauth/authorize および /oauth/token エンドポイント
必要なログイン プロンプトのクエリを許可する /login_info エンドポイント
/check_token エンドポイント。リソース サーバーが OAuth2 クライアントによって送信されたアクセス トークンに関する情報を取得できるようにします。
/token_key エンドポイント。リソース サーバーがトークン署名を検証するための検証キーを取得できるようにします。
SCIM ユーザー プロビジョニング エンドポイント
OpenID 接続エンドポイントは認証 /userinfo をサポートします。部分的な OpenID サポート。
認証は、資格情報を/oauth/authorize
エンドポイントに直接送信することにより、コマンド ライン クライアントで実行できます (UAA-API ドキュメントで説明されています)。 Spring Security OAuth には、クライアントが Java の場合に面倒な作業を実行できるImplicitAccessTokenProvider
があります。
認証する
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
これらのアプリはすべて、 /uaa
、 /app
、 /api
と同じポート (8080) で実行されているアプリと連携して動作します。
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 と対話する方が便利です。
UAA jvm デバッグ用に JDWP エージェントをロードするには、次のようにサーバーを起動します。
./gradlew run -Dxdebug=true
または
./gradlew -Dspring.profiles.active=default,hsqldb,debug run
その後、デバッガを jvm プロセスのポート 5005 に接続できます。
デバッガーが接続されるまでサーバーの起動を一時停止するには (起動コードのデバッグに役立ちます)、次のようにサーバーを起動します。
./gradlew run -Dxdebugs=true
または
./gradlew -Dspring.profiles.active=default,hsqldb,debugs run
./gradlew run
、デフォルトで hsqldb データベースを使用して UAA サーバーを実行します。
% 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 + データベースを実行する Docker コンテナーが作成され、それに対して統合テストが実行されます。
デフォルトの UAA 単体テスト (./gradlew test integrationTest) は hsqldb を使用します。
docker を使用して単体テストを実行するには:
$ run-unit-tests.sh <dbtype>
デフォルトの uaa 単体テスト ( ./gradlew test
) は hsqldb を使用します。
まず、テストがどの Gradle プロジェクトに属しているかを確認します。実行するとすべてのプロジェクトを見つけることができます
$ ./gradlew projects
特定のテスト クラスを実行するには、モジュールとテスト クラスを指定できます。
$ ./gradlew :<project name>:test --tests <TestClass>.<MethodName>
この例では、cloudfoundry-identity-server モジュールで JdbcScimGroupMembershipManagerTests テストのみを実行しています。
$ ./gradlew :cloudfoundry-identity-server:test
--tests "org.cloudfoundry.identity.uaa.scim.jdbc.JdbcScimGroupMembershipManagerTests"
または、クラス内のすべてのテストを実行します
$ ./gradlew :<project name>:test --tests <TestClass>
scripts/unit-tests.sh
スクリプトの最後にある完全な Gradle コマンドを使用するには、 test
コマンドの前にプロジェクト名を追加し、 --tests
オプションを追加します。
$ ./gradlew :clean :assemble -Pversion=${UAA_VERSION}
実際には、ここにはメインのuaa
サーバー アプリケーション、クライアント ライブラリ、およびいくつかのサンプルなど、いくつかのプロジェクトがあります。
uaa
簡単にデプロイできる WAR プロジェクトです
UAA の REST API (SCIM を含む) と UI の実装を含む JAR プロジェクトserver
クライアント ライブラリとサーバーの両方で使用される JAR プロジェクトmodel
api
(サンプル) は、デプロイされたアプリの模擬リストを返す OAuth2 リソース サービスです。
app
(サンプル) は上記の両方を使用するユーザー アプリケーションです
CloudFoundry 用語で言うと
uaa
、(OAuth2 アクセス トークンを発行することにより) 認証サービスとバックエンド サービスおよびアプリの承認された委任を提供します。
api
、リソース所有者 (エンド ユーザー) に代わって、他のアプリケーションがアクセスする可能性のあるリソースを提供するサービスです。
app
ユーザーに代わってシングル サインオンとapi
サービスへのアクセスを必要とする Web アプリです。
前提条件
Kubernetes デプロイメントは現在開発中です。頻繁な (場合によっては破壊的な) 変更が発生することが予想されます。この機能セットの進捗に応じて、このセクションは更新されます。現時点では:
K8s ディレクトリには、レンダリングして K8s クラスターに適用できるytt
テンプレートが含まれています。
開発では、この 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 の統合をデバッグするには、VMWare の Bitnami プロジェクトの OpenLdap Docker イメージを使用します。
uaa/src/main/resources/uaa.yml
を変更し、行 7 のspring_profiles: ldap,default,hsqldb
のコメントを解除して LDAP を有効にします。scripts/ldap
ディレクトリからdocker-compose up
実行しますscripts/ldap
からdocker-confirm-ldapquery.sh
を実行して、実行中の OpenLdap コンテナへの接続を確認します。./gradlew run
で UAA を開始する/uaa
に移動し、LDAP ユーザーuser01
とパスワードpassword1
を使用してログインします。以下のコマンドを使用して、コンテナーとボリュームをクリーンアップします。
docker-compose down --volumes