1.3.4、新建一个系统变量:变量名为JAVA_HOME 变量值为java安装路径
1.3.5、在Path变量中新建一个变量,名为%JAVA_HOME%\bin,然后确定保存退出即可
1.3.6、检查java设置是否正常,打开cmd输入java -version查看当前java版本
1.3.7、进入keycloak目录下的bin文件夹,然后创建管理员账户(web控制台登录使用)执行:kc.bat bootstrap-admin user 然后根据提示设置账号密码
1.3.8、windows:bin目录下执行kc.bat start-dev
1.3.9、浏览器输入http://server-IP:8080即可访问到平台登录页面,输入前期配置的账号密码登录即可访问,平台搭建完毕
1.4、linux部署:以centos8举例
a)安装java环境,使用yum安装java17以上版本
使用yum安装
yum install java-17-openjdk-devel
配置环境变量
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin
PATH 使用java -version确认版本
1.4.1、将linux的以tar结尾的压缩包上传到linux后台,然后使用tar -zxvf 压缩包名,将文件解压
1.4.2、使用cd进入解压的目录下的bin目录,执行./kc.sh bootstrap-admin user 创建管理员账号
1.4.3、在bin目录下执行 ./kc.sh start-dev 启动服务
1.4.4、浏览器输入http://server-IP:8080即可访问到平台登录页面,输入前期配置的账号密码登录即可访问,平台搭建完毕
2、keycloak使用指引和oauth2认证配置指引
2.1、浏览器输入http://server-IP:8080即可访问到平台登录页面,输入前期配置的账号密码登录即可访问
2.2、设置中文,根据下图设置后退出就变成中文页面了
2.3、领域(realm):领域的概念类似于vpc,领域之间的应用和用户相互隔离,涉及的API接口、认证方式也都是独立的,实验中可以新建也可以使用默认的master,领域名字要记住,后续调用api时会用到(不是所有4A平台都有领域的概念)
2.4、创建客户端:应用(OA、零信任)和4A平台(keycloak、oauth2平台)对接时,应用在4A平台中就叫做客户端,一个客户端对应一个业务系统
选择对应的领域-客户端-创建客户端即可开始创建过程
第一步输入客户端ID和名称,客户端ID就是client_id,这个要记住后续会用到(所有4A平台都有),是4A要提供给零信任的信息之一
2.5、开启客户端认证、授权、勾选oauth2
2.6、配置应用回调地址,此地址由零信任提供给4A平台,由4A平台管理员填写到此处。配置后保存即可
2.7、配置后即可看到对应的应用在列表中
2.8、配置应用角色:和零信任、sslvpn一样,keycloak也有角色的定义,也是用于授权的,需要先创建角色,然后给用户分配角色,用户就可以拥有对应应用的权限
每个客户端创建好之后,都会默认带一个名为uma_protection的角色,不同客户端中虽然都会存在同名角色,但是实际不同,这里也可以不单独创建角色,复用默认的就行
2.9、获取客户端秘钥:点击客户端的凭证页面,将客户端密码记录下来,这个就是client_secret,后续会用到这个参数(所有4A平台都有)
2.10、配置用户账户
2.11、配置用户名,创建后会直接到用户详情页面
响应示例:
HTTP/1.1 302 Found
获取token接口:/realms/{realm-name}/protocol/openid-connect/token
请求示例:
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
请求方法:POST
请求头:
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"refresh_token": "8xLOxBtZp8",
"expires_in": 3600,
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzc
yI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5
NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZ
fV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5Nz
AKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6q
Jp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJ
NqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7Tpd
QyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoS
K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4
XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg"
}
获取用户信息接口:/realms/{realm-name}/protocol/openid-connect/userinfo
请求示例:
GET /userinfo HTTP/1.1
Host: server.example.com
Authorization: Bearer SlAV32hkKG
响应示例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"sub": "248289761001",
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"preferred_username": "j.doe",
"email": "janedoe@example.com",
"picture": "http://example.com/janedoe/me.jpg"
}