UAA 是 User Account and Authentication 首字母的缩写, 是 CloudFoundry(一个 PaaS 服务供应商)开源的用户帐号和身份认证服务,可用于搭建 OAuth2 认证授权服务器。
打开 uaa github 页面,按照文档说明,检出源码,默认分支为 develop,因为 develop 分支内容会不断更新,内容更新后可能运行效果与文档描述不符,所以这里使用最近的一个固定版本 74.21.0。
服务会使用 8080 和 8081 端口,如果这些端口已被使用会导致启动失败。启动成功后,服务处于监听状态:
Figure 1. 本地启动项目
如果启动失败,可以通过命令 sudo lsof | grep uaa.log
找到日志文件:
Figure 2. 定位日志文件
然后查看日志信息: tail -100f /private/var/folders/1s/ly4n5ft11r19j6859j20mb380000gn/T/uaa-8080/logs/uaa.log
服务停止后,8080 端口会释放,但 8081 端口不会,需要手动 kill 8081 端口,才能再次启动服务。
默认使用 hsqldb 内存数据库,你可以切换成 postgresql 或者 mysql。
打开配置文件 uaa/src/main/resources/uaa.yml:
启用 MYSQL profile:
Figure 3. 启用 MYSQL 配置
修改 MYSQL 配置:
Figure 4. 修改 MYSQL 配置
在本地创建 uaa 数据库: create database uaa
。
使用 MYSQL8 会有问题,这是一个已知的 BUG 940,因为 UAA 使用的 groups 表在 MYSQL8 中成了关键字,目前官方尚未修复此 BUG。笔者本机之前使用的 8.0 版本,测试无法使用,重新通过 docker 装了一个 5.7.30 版本才可以。
UAA 默认使用 HMAC256 加密算法生成签名,签名 key 值默认为:tokenKey。连接 UAA 认证服务器的资源服务器也需要用此签名 key 校验 token 值。在使用 org.springframework.security:spring-security-oauth2-jose:5.3.2.RELEASE
搭建资源服务器时,Spring 默认使用 client_secret 的值作为签名 key,所以两者不兼容。
为了统一两者,改成 RSA 签名方式,打开 scripts/cargo/uaa.yml 文件,修改 jwt.token.signing-key :
Figure 5. 修改签名 Key
Figure 6. 修改签名 Key
HMAC256 是对称加密,所有只有一个值。RSA 是非对称加密,所以需要配置 2 个值,jwt.token.signing-key 配置私钥,jwt.token.verification-key 配置公钥。
通过 ./gradlew run
启动服务,不能在后台运行,也不能部署到服务器,现修改配置将其部署到 Tomcat,笔者这里使用的版本是 Tomcat 9.0.36。
拷贝 scripts/cargo/log4j2.properties 文件至 uaa/src/main/resources 目录下。
拷贝 scripts/cargo/uaa.yml 的内容至 uaa/src/main/resources/uaa.yml 中:
直接把拷贝的内容放在末尾,然后通过 --- 分割。
部署 uaa/build/libs/cloudfoundry-identity-uaa-0.0.0.war 到 Tomcat 实例:
先在 IDEA 内运行检查下是否存在问题,然后可以直接在 tomcat 目录下通过命令启动:
这是一个已知的问题 #805。 当你在资源服务器中将 issuer 配置为 http://localhost:8080/uaa 时,通过 http://localhost:8080/uaa/.well-known/openid-configuration 得到的 JSON 数据中 issuer 的值为 http://localhost:8080/uaa/oauth/token ,如此一来两个 issuer 的值就不同了,在使用org.springframework.security:spring-security-oauth2-jose:5.3.2.RELEASE
搭建资源服务器时,Spring 会校验这两个值必须相等。你需要将 issuer 配置为 http://localhost:8080/uaa/oauth/token ,通过 http://localhost:8080/uaa/oauth/token/.well-known/openid-configuration 获取配置信息也是符合标准规范的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。