松弛#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