简介
Keycloak以最小的麻烦为应用程序和安全服务添加身份验证。我们不需要再处理用户存储或者用户验证的事情,Keycloak可以开箱即用。
安装与运行
方式一:普通程序
下载
https://www.keycloak.org/downloads.html
执行
$ tar -xvzf keycloak-12.0.4.tar.gz
$ cd bin
$ ./standalone.sh
方式二:docker
KEYCLOAK_USER=admin是创建的用户名
KEYCLOAK_PASSWORD=admin是用户名对应的密码
如果需要用于项目,需要设置一个复杂的用户名和密码
$ docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:12.0.4
参数配置
打开浏览器,访问
http://127.0.0.1:8080/auth/
打开管理员终端,输入用户名admin,密码admin
添加一个realm
Keycloak的领域相当于一个租户。它允许创建独立的应用程序和用户组。默认情况下,Keycloak中会有一个名为master的领域,但这是用于管理Keycloak的,而不应该把master用于我们自己的应用程序。
输入领域的名字如demo,然后点击创建
添加一个用户
初始状态下,领域realm没有任何一个用户,所以我们需要先添加一个用户。
填写用户名,点击保存
设置密码
点击凭证,输入密码和密码确认,临时密码设置为off,然后点击设置密码按钮。
如果临时密码是On,那么下次登录的时候会提示修改密码。
验证用户
http://localhost:8080/auth/realms/demo/account/#/
注销用户,通过浏览器访问上面的地址,并点击登录。
输入刚才添加的用户名和密码,并点击登录。
添加应用
回到管理员界面
http://localhost:8080/auth
登录后选择前面创建的领域Demo,然后选择Clients客户端,点击右侧的创建。
填写ID为demo-client然后点击保存
获取Token
请求方式:POST
http://localhost:8080/auth/realms/demo/protocol/openid-connect/token
请求Header:
Accept: application/json
Content-Type: application/x-www-form-urlencoded
请求参数:
client_id: demo-client
grant_type: password
username: wilson
password: 123456
获取Realm信息
代码
package main
import (
"context"
"log"
"github.com/Nerzal/gocloak/v8"
)
func main() {
client := gocloak.NewClient("http://localhost:8080")
ctx := context.Background()
realmName := "master"
//登陆,输入用户名、密码、领域,返回toekn
token, err := client.LoginAdmin(ctx, "admin", "admin", realmName)
if err != nil {
log.Println("LoginAdmin error: ", err.Error())
return
}
log.Println("LoginAdmin token: ", token.AccessToken)
//获取所有领域信息
realms, err := client.GetRealms(ctx, token.AccessToken)
if err != nil {
log.Println("GetRealms error: ", err.Error())
return
}
log.Println("GetRealms token: ", realms)
}
运行
$ go run web.go
2021/03/31 16:38:11 LoginAdmin token: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia
获取用户信息
关键代码
users, err := client.GetUsers(ctx, token.AccessToken, realmName, gocloak.GetUsersParams{})
if err != nil {
log.Println("GetUsers error: ", err.Error())
return
}
log.Println("GetUsers users: ", users)
运行
$ go run web.go
2021/03/31 17:06:12 GetUsers users: [{
"id": "ee6ab572-1bfb-4ab5-88cc-09b84d7d2a16",
"createdTimestamp": 1617179772726,
"username": "admin",
"enabled": true,
"totp": false,
"emailVerified": false,
"disableableCredentialTypes": [],
"requiredActions": [],
"access": {
"impersonate": true,
"manage": true,
"manageGroupMembership": true,
"mapRoles": true,
"view": true
}
}]
创建领域
关键代码
demoRealm := "demo"
enable := true
//创建领域
realmid, err := client.CreateRealm(ctx, token.AccessToken, gocloak.RealmRepresentation{
Realm: &demoRealm,
Enabled: &enable,
})
if err != nil {
log.Println("CreateRealm error: ", err.Error())
return
}
log.Println("CreateRealm res: ", realmid)
运行
$ go run web.go
2021/03/31 17:09:17 CreateRealm res: demo
创建用户
关键代码
name := "Wilson"
//创建用户
str, err := client.CreateUser(ctx, token.AccessToken, demoRealm, gocloak.User{
Username: &name,
Enabled: &enable,
})
if err != nil {
log.Println("CreateUser error: ", err.Error())
return
}
log.Println("CreateUser str: ", str)
//设置密码
err = client.SetPassword(ctx, token.AccessToken, str, demoRealm, "123456", false)
if err != nil {
log.Println("SetPassword error: ", err.Error())
return
}
log.Println("SetPassword success")
运行
$ go run web.go
2021/03/31 17:40:57 CreateUser str: 5495f328-b3f2-4eb9-abb1-eb6bc4076ae3
2021/03/31 17:40:57 SetPassword success