KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
02 · 跑起第一个 IdP — keel 龙骨
上一章说的那个"专门做证明的角色"(IdP),这一章给它一个实物:Keycloak—— 一个开源的 IdP 软件。不用安装,一条 docker 命令就能跑起来。
上一章说的那个"专门做证明的角色"(IdP),这一章给它一个实物:Keycloak——
一个开源的 IdP 软件。不用安装,一条 docker 命令就能跑起来。
前置:这一章要求本机有一个能用的 Docker(
docker version里Client和Server两段都在,
才算装好且正在运行)。不会 Docker 也没关系——你只要照抄下面那一条命令;
想补基础,看《Docker 基础课》。
一、一条命令把它跑起来
docker run -d --name sso-kc \
-p 8081:8080 \
-e KC_BOOTSTRAP_ADMIN_USERNAME=admin \
-e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:26.8.1 start-dev
敲完会输出一长串十六进制字符,那是这个容器的编号:
8f3c1b2a9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a
它不会立刻就能用——Keycloak 起得慢一点。等几秒,看它的日志:
docker logs sso-kc 2>&1 | grep "started in"
看到这一行,就说明它活了:
INFO [io.quarkus] (main) Keycloak 26.8.1 on JVM (powered by Quarkus 3.40.1) started in 9.456s. Listening on: http://0.0.0.0:8080
数字每次不一样(
9.456s是这次启动花的时间),要读的是形状:Keycloak <版本>+started in …+Listening on: http://0.0.0.0:8080
(日志每行前面还有一个时间戳,这里省掉了)。
再看一眼它公开的那份清单,确认地址真的通了:
curl -s http://localhost:8081/realms/master/.well-known/openid-configuration | head -c 200
{"issuer":"http://localhost:8081/realms/master",
"authorization_endpoint":"http://localhost:8081/realms/master/protocol/openid-connect/auth",
"token_endpoint":"http://localhost:8081/realms/master/protocol/openid-connect/token", ...
issuer 里是 localhost:8081——就是你刚才在 -p 里选的那个端口。
(master 是 Keycloak 自带的一个管理用 realm;第 3 章会建你自己的那个。)
二、这一行的每一段在做什么
把命令拆开看:
| 片段 | 它在做什么 |
|---|---|
docker run |
从一个镜像启动一个容器 |
-d |
后台运行,不占用你的终端 |
--name sso-kc |
给容器起名叫 sso-kc,后面用它指代,不用记那串 id |
-p 8081:8080 |
端口映射:冒号左边是你电脑的 8081,右边是容器里的 8080 |
-e KC_BOOTSTRAP_ADMIN_USERNAME=admin |
往容器里传一个环境变量:第一次初始化时用的管理员用户名 |
-e KC_BOOTSTRAP_ADMIN_PASSWORD=admin |
同上,密码。只在容器头一次启动、里面还没有账号时生效 |
quay.io/keycloak/keycloak:26.8.1 |
跑哪个镜像:Keycloak,标签 26.8.1(版本号) |
start-dev |
镜像启动后要执行的命令:以开发模式启动 |
-p 这一段最容易看错方向,和 Docker 里所有 -p 是同一种读法:
-p 8081:8080
↑ ↑
你的电脑 容器里面
Keycloak 在容器里固定监听 8080,于是你在浏览器里要访问的是 localhost:8081。
用它:http://localhost:8081/admin/ 就是它的管理控制台登录页。
自检两条:
docker version(Client/Server两段都在)、docker ps --filter name=sso-kc(应看到一行,PORTS列是0.0.0.0:8081->8080/tcp)。
重跑会报名字冲突:
docker: Error response from daemon: Conflict. The container name "/sso-kc" is already in use by container "…". You have to remove (or rename) that container to be able to reuse that name.
这不是坏了。想从头再来一遍,先docker rm -f sso-kc把它删掉。
三、它不是什么
日志里那一行大写的话,请当真:
Running the server in development mode. DO NOT use this configuration in production.
- 这不是生产部署方式。
start-dev是开发模式:走的是明文http(没有 TLS)、
内置一个轻量数据库、管理员账号还是临时的(日志里那句Created temporary admin user with username admin就是它)。
换到生产要换成正式启动方式、配外部数据库与证书——那是《SSO 应用课》的范围。 - 这也不代表"你的密码是安全的"。 这里用的
admin/admin只是本机实验的口令,
别照抄到任何真实环境。
读完你能做什么
- 用一条
docker命令起一个真实的 IdP,并看懂日志里"启动成功"是哪一行; - 说出
-p 8081:8080、两个-e、start-dev各自在做什么; - 知道这套配置只是本机实验,不是生产做法。
下一步:IdP 起来了,但它现在还不知道"你的应用"是谁。
下一章把你的应用登记进去,然后亲眼走一遍"跳去登录、再跳回来"。