鬆弛#uaa
UAA 是一種多租戶身分管理服務,在 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 連線端點以支援身份驗證/使用者資訊。部分 OpenID 支援。
命令列用戶端可以透過直接向/oauth/authorize
端點提交憑證來執行身份驗證(如 UAA-API 文件中所述)。如果您的客戶端是 Java,Spring Security OAuth 中有一個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 互動會更方便。
若要載入 JDWP 代理程式以進行 UAA jvm 偵錯,請如下啟動伺服器:
./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 testintegrationTest)使用 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>
您可能希望透過將專案名稱新增至test
命令並新增--tests
選項來使用位於scripts/unit-tests.sh
腳本底部的完整 gradle 命令。
$ ./gradlew :clean :assemble -Pversion=${UAA_VERSION}
這裡實際上有幾個項目,主要的uaa
伺服器應用程式、客戶端庫和一些範例:
uaa
一個易於部署的 WAR 項目
server
包含 UAA 的 REST API(包括 SCIM)和 UI 的實作的 JAR 項目
為客戶端庫和伺服器使用的 JAR 專案model
api
(範例)是一個 OAuth2 資源服務,它傳回已部署應用程式的模擬列表
app
(範例)是一個使用上述兩者的使用者應用程式
在 CloudFoundry 術語中
uaa
為後端服務和應用程式提供身分驗證服務和授權委託(透過頒發 OAuth2 存取權杖)。
api
是一種服務,它提供其他應用程式可能希望代表資源所有者(最終用戶)存取的資源。
app
是一個 web 應用程序,需要單一登入並代表使用者存取api
服務。
先決條件
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
來啟用 LDAPscripts/ldap
運行docker-compose up
scripts/ldap
透過執行docker-confirm-ldapquery.sh
驗證與運行 OpenLdap 容器的連接./gradlew run
啟動 UAA/uaa
並使用 LDAP 使用者user01
和密碼password1
登入使用以下命令清理容器和磁碟區:
docker-compose down --volumes