当前位置: 首页 > article >正文

【UAA】从部署到接口调用

UAA搭建

the User Account and Authentication (UAA) Server,用户账户、鉴权服务。

The primary role of UAA is as an OAuth2 provider, issuing tokens for client apps.

OAuth defines four roles:

  • resource owner

    An entity capable of granting access to a protected resource. When the resource owner is a person, it is referred to as an end-user.

  • resource server

    The server hosting the protected resources, capable of accepting and responding to protected resource requests using access tokens.

  • client

    An application making protected resource requests on behalf of the resource owner and with its authorization. The term “client” does not imply any particular implementation characteristics (e.g., whether the application executes on a server, a desktop, or other devices).

  • authorization server

    The server issuing access tokens to the client after successfully authenticating the resource owner and obtaining authorization.

一、环境

  • 操作系统:CentOS 7
  • Java Version:jdk-8u281-linux-i586.tar.gz
  • Tomcat Version:apache-tomcat-8.5.34.tar.gz
  • UAA WAR:cloudfoundry-identity-uaa-4.30.0.war

cloudfoundry uaa的官方指导文档,doc,主要介绍uaa的能力,以及搭建方式。doc中的搭建方式需要本地编译,问题有点多。推荐使用war包部署。

二、部署UAA

cloudfoudry是一个云平台,包含很多组件,这里仅使用它的UAA服务。

2.1 UAA.yml

UAA war有默认的配置文件uaa.yml,同时支持额外外部自定义配置文件。实现方式:

1.UAA_CONFIG_PATH

通过环境变量指定配置文件位置,UAA会去检查此目录下的uaa.yml文件

export UAA_CONFIG_PATH=/root/.uaa

2.yaa.yml

参考:

  • Sysadmin-Guide.rst 介绍uaa.yml的部分字段含义
  • uaa job from uaa/75.0.0 介绍uaa.yml的字段含义,参考意义大于实用意义

自定义配置:

issuer:uri: http://localhost:8080/uaaencryption:active_key_label: CHANGE-THIS-KEYencryption_keys:- label: CHANGE-THIS-KEYpassphrase: CHANGEMElogin:serviceProviderKey: |-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQDHtC5gUXxBKpEqZTLkNvFwNGnNIkggNOwOQVNbpO0WVHIivig5L39WqS9u0hnA+O7MCA/KlrAR4bXaeVVhwfUPYBKIpaaTWFQR5cTR1UFZJL/OF9vAfpOwznoD66DDCnQVpbCjtDYWX+x6imxn8HCYxhMol6ZnTbSsFW6VZjFMjQIDAQABAoGAVOj2Yvuigi6wJD99AO2fgF64sYCm/BKkX3dFEw0vxTPIh58kiRP554Xt5ges7ZCqL9QpqrChUikO4kJ+nB8Uq2AvaZHbpCEUmbip06IlgdA440o0r0CPo1mgNxGulhiWRN43Lruzfh9qKPhleg2dvyFGQxy5Gk6KW/t8IS4x4r0CQQD/dceBA+Ndj3XpubHfxqNz4GTOxndc/AXAowPGpge2zpgIc7f50t8OHhG6XhsfJ0wyQEEvodDhZPYXkKBnXNHzAkEAyCA76vAwuxqAd3MObhiebniAU3SnPf2u4fdL1EOm92dyFs1JxyyLgu/DsjPjx6tRtn4YAalxCzmAMXFSb1qHfwJBAM3qx3z0gGKbUEWtPHcP7BNsrnWKvw6By7VC8bk/ffpaP2yYspS66Le9fzbFwoDzMVVUO/dELVZyBnhqSRHoXQcCQQCeA2WL8S5o7Vn19rC0GVgu3ZJlUrwiZEVLQdlrticFPXaFrn3Md82ICww3jmURaKHSN+l4lnMda79eSp3OMmq9AkA0p79BvYsLshUJJnvbk76pCjR28PK4dV1gSDUEqQMBqy45ptdwJLqLJCeNoR0JUcDNIRhOCuOPND7pcMtX6hI/-----END RSA PRIVATE KEY-----serviceProviderKeyPassword: passwordserviceProviderCertificate: |-----BEGIN CERTIFICATE-----MIIDSTCCArKgAwIBAgIBADANBgkqhkiG9w0BAQQFADB8MQswCQYDVQQGEwJhdzEOMAwGA1UECBMFYXJ1YmExDjAMBgNVBAoTBWFydWJhMQ4wDAYDVQQHEwVhcnViYTEOMAwGA1UECxMFYXJ1YmExDjAMBgNVBAMTBWFydWJhMR0wGwYJKoZIhvcNAQkBFg5hcnViYUBhcnViYS5hcjAeFw0xNTExMjAyMjI2MjdaFw0xNjExMTkyMjI2MjdaMHwxCzAJBgNVBAYTAmF3MQ4wDAYDVQQIEwVhcnViYTEOMAwGA1UEChMFYXJ1YmExDjAMBgNVBAcTBWFydWJhMQ4wDAYDVQQLEwVhcnViYTEOMAwGA1UEAxMFYXJ1YmExHTAbBgkqhkiG9w0BCQEWDmFydWJhQGFydWJhLmFyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHtC5gUXxBKpEqZTLkNvFwNGnNIkggNOwOQVNbpO0WVHIivig5L39WqS9u0hnA+O7MCA/KlrAR4bXaeVVhwfUPYBKIpaaTWFQR5cTR1UFZJL/OF9vAfpOwznoD66DDCnQVpbCjtDYWX+x6imxn8HCYxhMol6ZnTbSsFW6VZjFMjQIDAQABo4HaMIHXMB0GA1UdDgQWBBTx0lDzjH/iOBnOSQaSEWQLx1syGDCBpwYDVR0jBIGfMIGcgBTx0lDzjH/iOBnOSQaSEWQLx1syGKGBgKR+MHwxCzAJBgNVBAYTAmF3MQ4wDAYDVQQIEwVhcnViYTEOMAwGA1UEChMFYXJ1YmExDjAMBgNVBAcTBWFydWJhMQ4wDAYDVQQLEwVhcnViYTEOMAwGA1UEAxMFYXJ1YmExHTAbBgkqhkiG9w0BCQEWDmFydWJhQGFydWJhLmFyggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAYvBJ0HOZbbHClXmGUjGs+GS+xC1FO/am2suCSYqNB9dyMXfOWiJ1+TLJk+o/YZt8vuxCKdcZYgl4l/L6PxJ982SRhc83ZW2dkAZI4M0/Ud3oePe84k8jm3A7EvH5wi5hvCkKRpuRBwn3Ei+jCRouxTbzKPsuCVB+1sNyxMTXzf0=-----END CERTIFICATE-----#The secret that an external login server will use to authenticate to the uaa using the id `login`
LOGIN_SECRET: loginsecretspring_profiles: postgresql,default
database:driverClassName: org.postgresql.Driverurl: jdbc:postgresql://localhost:5432/uaausername: postgrespassword: 123#jwt:
#  token:
#    signing-key: tokenKey
jwt:token:signing-key: |-----BEGIN RSA PRIVATE KEY-----MIIEpAIBAAKCAQEA7FfVYQay0MEWPD5y2bRo8rKzz5ngvg7PFTZz756pKA7Q1a9bnW5FtLQ5y2k+SFdOFKzEMdgAfyxMX2RfL9cChUJVkgagESlDrJ2U1BFEbEuTEXl5ZKGX5XRPt82Zk4A/gxDyAcQuqeQcDD7vWYCaQV2c1j8qsgr/ZuS1Bopq091x6VXliSX9P+4YZVjP1+Us5CF7iSJTwuABWCe6dEseugs8gqWYkPm6c8KzvV3m+lLFXixQr0UBgv552UHMZSJ+anybZB3uSpy6zRYANY8cEkIDjDK6fU8PG9/IvNP2HWScwUyfEkFw+dBqaYtu0Jp/DfE2jDHabRbQJqsQadANXQIDAQABAoIBADXueR+x8p4WYaePrI+nToeLZeLKv3E/WdwCWARnFTyx3M/WOza6kieBNOsI8hB587ReFEs3ei2LA0aFVf9JtiaIk5RF9MLVwr6iGvMlmZKI0F+dc6kWAt52YzaTMSdqjZOwCzmB9hAIoKnetqma4hhmb0KomWqVfeCR8gkzDtuXbXtj8Cv2tgpWNmYCq7mZCar9ZNJomhTJtWavIdunYuruP+pOI2G6BElHGofdqFfOCLczCCSeWjD/C4D2Htc7Ee2Gj8uyHSveqaxnCjvAuDne+Sh9+rS2RYnmI3QVHeMHFAuAVDpk6gVrs7WEQsg0kIxgSqRR2X3sruVVaU0N4qECgYEA+9A96ViKQgW3sUXI+NWa/EHNY7tXy3g4lBrSFgnGsU4qm30xwam9kFjEPx2c6+HTxp1lnNYhZxJI6miNYqwMsNtaqHrkI16RoNG/9eaiNhxrOD7rnYYY7+5YJQmGSPDzayZktqStqOQgmoWs2vEGxM29eQv8AXDSmpVSIJa+KIUCgYEA8EW/VqBFbBcH2KnOSnuGEHOlhtFPaURgE1icjYzRT9GkJ1Y/pugZ6T1/SgAtKcTD8AcMy4Lj14dNC9Y4laiwCJsof+QBnRSMJRt9F7t9GdFbbJAR6C3Rewwe+U3IpyDjWkSBPRk3nG2TTu+y0aCPR/RsYipsbE6VgXxjwvwDVPkCgYAC1+MbE2jcPfxJACS4ypCpcITFL4RaQ80/vt3IaevYbK2Ge+9n5GbDjn0IyWjQMQiXIYfYMYLHCynPm8ac6pxqEs//PwP8ckDqs/Oa7zO9sKx1QiCe8ritXN+Z63WctTvKZfCVL17WnVzQ4dmFz1roNfqBt2TtDz0RicYXoBwdkQKBgQCnJH3kLv3cIXFN4WImIiOy0iA11uldGzmSe7P8LBd3ZSjCTJde7lsIC8W+nrzML5r2IJFgCR+iUPbh4xXd1kkO05Cq1tvgf+i175dnqP9vtFna/aXXU/hDlrz9RITu7kv6AWm+LQqogPlWkhxdA0ppDblP2J8wAMK0HunvPAy9UQKBgQC6t/jAQd/lukod/fHozDjHmG5R+oA2L5OmNkRh95p/T2C2fpjJ2LYXMzkjT9jKSKZOwrioiFx2yS8TMqxt63V9icH+qxy92jyXyeew2TsaIAIwfMqfuE42LesyFJraT+yAYN3I1815JltFyZADx66EDjkrQ7N3843+MUyvInHpzg==-----END RSA PRIVATE KEY-----verification-key: |-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7FfVYQay0MEWPD5y2bRo8rKzz5ngvg7PFTZz756pKA7Q1a9bnW5FtLQ5y2k+SFdOFKzEMdgAfyxMX2RfL9cChUJVkgagESlDrJ2U1BFEbEuTEXl5ZKGX5XRPt82Zk4A/gxDyAcQuqeQcDD7vWYCaQV2c1j8qsgr/ZuS1Bopq091x6VXliSX9P+4YZVjP1+Us5CF7iSJTwuABWCe6dEseugs8gqWYkPm6c8KzvV3m+lLFXixQr0UBgv552UHMZSJ+anybZB3uSpy6zRYANY8cEkIDjDK6fU8PG9/IvNP2HWScwUyfEkFw+dBqaYtu0Jp/DfE2jDHabRbQJqsQadANXQIDAQAB-----END PUBLIC KEY-----smtp:host: testmail.virtual.comport: 25user: test@testmail.virtual.compassword: xxx
issuer

token的分发者

login

database

UAA will use an in-memory database that is torn down between runs unless you choose a spring profile or a specific database configuration as a toplevel setting in uaa.yml. An example connecting to a postgres database:

spring_profiles: postgresql,default
database:driverClassName: org.postgresql.Driverurl: jdbc:postgresql://localhost:5432/uaausername: postgrespassword: 123
jwt

UAA can use either symmetric key encryption (shared secrets) or public key encryption.

Generating new asymmetric key pairs

# jwt.token.signing-key
openssl genrsa -out privkey.pem 2048
# jwt.token.verification-key
openssl rsa -pubout -in privkey.pem -out pubkey.pem
smtp

邮件服务器配置,允许通过页面注册用户,需要配置邮箱服务器。

smtp:host: testmail.virtual.comport: 25user: test@testmail.virtual.compassword: xxx

2.2 Tomcat部署

正常tomcat部署即可。

浏览器访问: http://localhost:8080/uaa,有登陆界面即可

三、UAAC

管理员用户的命令行管理工具,可以对client、group、user、scope进行管理。

参考:

  • User Account and Authentication (UAA) Server 介绍UAA验证服务的搭建
  • Creating and Managing Users with the UAA CLI (UAAC) 介绍UAAC的使用方式
  • UAA Concepts 介绍UAA中zone、client、group、client的部分概念

2.1 安装cf-uaac

uaac依赖ruby环境,先安装ruby的环境,yum默认的是2.0.0版本,不可用,需要安装高版本的ruby。安装方式如下:

升级gcc环境

yum install -y gcc gcc-c++

scl安装

yum install centos-release-scl-rh //会在/etc/yum.repos.d/目录下多出一个CentOS-SCLo-scl-rh.repo源

yum install rh-ruby27 -y     //直接yum安装即可

yum install rh-ruby27-ruby-devel

scl enable rh-ruby27 bash    //必要一步

ruby -v    //查看安装版本 ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]

gem -v //查看安装版本 3.1.2

cf-uaac

gem install cf-uaac // 安装uaac

uaac -v // 查看版本 UAA client 4.2.0

2.2 设置uaac指向

将uaac指向正在运行中的UAA服务实例

uaac target http://localhost:8080/uaa

2.3 注册client、user、group

./WEB-INF/spring/oauth-clients.xml 有默认的client,其中admin具有管理员权限,可以注册、变更client、group、user信息

<entry key="admin"><map><entry key="authorized-grant-types" value="client_credentials" /><entry key="scope" value="uaa.none" /><entry key="authorities" value="uaa.admin,clients.read,clients.write,clients.secret,scim.read,scim.write,clients.admin" /><entry key="secret" value="adminsecret" /></map>
</entry>

client、group、user的操作都属于管理员操作,操作前,需要验证自身具备这些权限:

uaac token client get admin -s adminsecret

使用uaac contexts可以查看当前的连接信息,这部分信息默认存储在~/.uaac.yml

uaac contexts

查看当前已有的client

uaac clients

新建client

UAA是一个OAuth2服务,在服务启动后,开发者必须第一时间创建一个client。

client采用XHR的简单验证。

uaac client add webappclient -s webappclientsecret
–name WebAppClient
–scope resource.read,resource.write,openid,profile,email,address,phone
–authorized_grant_types authorization_code,refresh_token,client_credentials,password
–authorities uaa.resource
–redirect_uri http://localhost:8081/login/oauth2/code/uaa

  • name 客户端名称
  • scope 客户端支持的权限范围。默认scope解释
  • authorized_grant_types 客户端支持的验证类型。参考select-type
  • authorities
  • redirect_uri 用户验证成功后,默认的跳转路径

此时执行uaac clients可以看到新建的client WebAppClient。

新建用户

uaac user add appuser -p appusersecret --emails appuser@acme.com

此时执行 uaac users -a username可以看到新建的用户

新建权限组

UAA有默认的权限组,不同的权限组代表具有不能的能力。另,支持自定义权限组。

uaac group add resource.read

uaac group add resource.write

此时执行uaac groups -a displayname可以看到新建的用户

关联权限组

uaac member add resource.read appuser

uaac member add resource.write appuser

四、Rest API

UAA服务提供REST API的访问,参考文档:

  • 理解OAuth2.0
  • The OAuth 2.0 Authorization Framework
  • UAA-APIs.rst
  • UAA API DOC

1. 获取Admin凭证

xhr: doc

客户端admin账户是UAA服务的内置账户,存在配置文件./WEB-INF/spring/oauth-clients.xml,有UAA服务中client、group、user的读写权限。

curl 'http://localhost:8080/uaa/oauth/token' -i -u 'admin:adminsecret' -X POST -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: application/json' -d 'grant_type=client_credentials&token_format=opaque'

参数

  • token_format token格式化方式。opaque和jwt,前者为不透明的token

Response

{"access_token": "d6eb1382943c4f819bc143c8912c655b","token_type": "bearer","expires_in": 43199,"scope": "clients.read clients.secret clients.write uaa.admin clients.admin scim.write scim.read","jti": "d6eb1382943c4f819bc143c8912c655b"
}

备注:

下面出现的${ADMIN_TOKEN}为:

d6eb1382943c4f819bc143c8912c655b

2. Client API

支持对客户端的单个、批量操作。

2.1 Create One Client

xhr:doc

 curl 'http://192.168.10.56:8080/uaa/oauth/clients' -i -X POST -H 'Content-Type: application/json' -H 'Authorization: Bearer ${ADMIN_TOKEN}' -H 'Accept: application/json' -d '{ "scope" : [ "clients.read", "clients.write", "openid", "profile", "resource.read", "resource.write" ], "client_id" : "uiclient", "client_secret" : "secret", "resource_ids" : [ ], "authorized_grant_types" : [ "client_credentials" ], "authorities" : [ "clients.read", "clients.write", "openid", "profile","resource.read", "resource.write" ], "token_salt" : "cdGXbD", "autoapprove" : true, "name" : "uiclient web client" }'

请求头:

  • authorization:值为第一步(获取Admin凭证)请求的Response的access_token

参数

  • scope:客户端具备的范围
  • authorities:创建一个客户端时,标识这个客户端能给予USER的授权范围
  • redirect_uri:用户在当前客户端鉴权成功后,重定向的路由

2.2 Delete One Client

xhr:doc

curl 'http://192.168.10.56:8080/uaa/oauth/clients/uiclient' -i -X DELETE -H 'Authorization: Bearer ${ADMIN_TOKEN}' -H 'Accept: application/json'

Response:

{"scope": ["clients.read","clients.write","openid"],"client_id": "uiclient","resource_ids": ["none"],"authorized_grant_types": ["client_credentials"],"redirect_uri": ["https://www.baidu.com"],"autoapprove": ["true"],"authorities": ["clients.read","clients.write"],"token_salt": "cdGXbD","name": "uiclient web client","lastModified": 1617778508969,"required_user_groups": []
}

2.3 Update One Client

xhr:doc

curl 'http://localhost:8080/uaa/oauth/clients/uiclient' -i -X PUT -H 'Content-Type: application/json' -H 'Authorization: Bearer ${ADMIN_TOKEN}' -H 'Accept: application/json' -d '{"client_id": "uiclient", "scope" : [ "swl.test" ] }'

2.4 Retrieve One Client Info

xhr:doc

curl 'http://192.168.10.56:8080/uaa/oauth/clients/uiclient' -i -X GET -H 'Authorization: Bearer ${ADMIN_TOKEN}' -H 'Accept: application/json'

Response:

{"scope": ["clients.read","clients.write"],"client_id": "uiclient","resource_ids": ["none"],"authorized_grant_types": ["client_credentials"],"redirect_uri": ["https://www.baidu.com"],"autoapprove": ["true"],"authorities": ["clients.read","clients.write"],"token_salt": "cdGXbD","name": "uiclient web client","lastModified": 1617778508969,"required_user_groups": []
}

3. Group API

doc

4. User API

doc

五、uaa-client-side工具库

The table below describes the client-side tools and libraries UAA uses:

NameLanguage
UAAC CF-UAA-LIBRuby
Spring Security OAuthJava
CF Java ClientJava
UAA Javascript SDK (Singular)JS
http://www.lryc.cn/news/2416998.html

相关文章:

  • Android上使用tombstone定位问题的示例
  • Longhorn,企业级云原生容器分布式存储 - 定制默认设置
  • 关于Https中的headers的理解
  • 数据备份与数据容灾全解析
  • C# 读写ini文件
  • SSH服务远程访问及控制
  • ij工具的基础操作
  • DecimalFormat用法
  • GCC下载地址(linux/windows\安装)或从minGW中取得gcc
  • JSF 原理简要介绍
  • 802.11ac/ax (wifi6)中的Beamforming技术介绍
  • ERP系统之sap入门操作--sap的基本的了解入门
  • 港片怀旧:《鹰爪铁布衫》(1)
  • Linux环境如何下载文件
  • VRP基础
  • DNS是什么,有什么用(详细介绍版)
  • 【数模】多元线性回归分析
  • 单片机和sbit和sfr
  • 常用软件过程——RUP
  • TreeSet的使用方法总结、实现原理、使用示例
  • 语法制导的翻译总结
  • Aircrack-ng组件详解
  • 安卓屏幕分辨率及UI尺寸详解
  • 服务器配置篇 ━━ iis7配置php出现fastcgi的500错误,LocalSystem/LocalService/NetworkService/ApplicationPoolIdentity
  • 【UEFI实战】FSP简介
  • 并发——ScheduledThreadPoolExecutor 详解
  • 逻辑回归(Logistic)
  • 学习Qss--Qss的特性
  • 高并发下System.currentTimeMillis()性能问题及优化方案
  • 串口(SerialPort)的使用