WheezyBaton/keycloak-secure-api-demo
GitHub: WheezyBaton/keycloak-secure-api-demo
演示在Kubernetes中部署Keycloak与Node.js Express API,通过OAuth 2.0 + PKCE实现安全的JWT认证与RBAC权限控制的完整方案。
Stars: 0 | Forks: 0
# Keycloak 安全 API 示例(Kubernetes 中的 OAuth 2.0 + PKCE)
本项目演示了使用 **OAuth 2.0** 标准和 **PKCE**(Proof Key for Code Exchange)进行 API 安全性的生产级实现。该系统由作为身份提供商的 **Keycloak** 和 **Node.js Express API** 组成,两者均运行在 **Kubernetes** 集群中。
## 项目目标
* 使用 **Kubernetes** 实现安全的容器化环境。
* 使用 **JWT**(JSON Web Tokens)验证独立保护 API 安全。
* 实现 **基于角色的访问控制 (RBAC)**,API 根据用户角色(`admin` 与 `user`)返回不同的数据。
* 强制执行 **PKCE** 流程,以防止授权码注入攻击。
## 架构与流程
1. **身份提供商:** Keycloak (v22.0.0) 负责处理用户认证和令牌发放。
2. **API 安全:** Node.js 后端使用自定义的 `authenticateToken` 中间件。
3. **令牌验证:** API 不手动检查令牌,而是从 Keycloak 的 **JWKS**(JSON Web Key Set)端点获取公钥以验证 JWT 签名。
4. **安全流程:** * 客户端发起 **带 PKCE 的授权码流程**。
* 登录成功后,Keycloak 会发放包含用户角色的 JWT。
* API 在授予对 `/secure` 端点的访问权限之前,会验证令牌的签名、过期时间和角色。
## 使用的技术
* **后端:** Node.js, Express.js
* **认证:** Keycloak, OAuth 2.0, PKCE, JWT
* **基础设施:** Kubernetes (Deployments, Services, ConfigMaps)
* **DevOps:** Docker
## 前置条件
* 启用了 Kubernetes 的 **Docker Desktop**(或 Minikube)。
* **kubectl** CLI。
* **Node.js**(可选,用于本地开发)。
* **Git**。
## 设置说明
### 1. 构建并推送 API 镜像
由于 API 部署使用自定义镜像,您必须构建它并将其推送到您的 Docker registry:
```
cd api
docker build -t your-dockerhub-username/secure-api:1.0.0 .
docker push your-dockerhub-username/secure-api:1.0.0
cd ..
```
### 2. 更新 Kubernetes Manifests
打开 `k8s/4_api-deployment.yaml` 并使用您的 DockerHub 用户名更新 image 字段:
```
containers:
- name: api
image: your-dockerhub-username/secure-api:1.0.0
```
### 3. 部署到 Kubernetes
应用 `k8s/` 目录中的所有 manifests:
```
kubectl apply -f k8s/
```
### 4. 验证部署
等待所有 Pod 进入 `Running` 状态:
```
kubectl get pods --watch
```
### 5. 端口转发
要在本地访问服务,请在两个单独的终端中转发必要的端口:
* **终端 1 (Keycloak):**
```
kubectl port-forward svc/keycloak 8080:8080
```
* **终端 2 (API):**
```
kubectl port-forward svc/api 3000:80
```
## 测试应用程序
### 测试凭证
| 用户 | 密码 | 角色 |
| --- | --- | --- |
| **admin** | `admin123` | admin |
| **user1** | `user123` | user |
*Keycloak 管理控制台:[http://localhost:8080/auth/admin](https://www.google.com/search?q=http://localhost:8080/auth/admin)(登录:`admin` / `admin`)*
### 自动化测试脚本
本项目包含一个全面的测试脚本(`skrypttest.sh`),它执行 16 项不同的安全测试,包括:
* 未授权访问尝试。
* 令牌发放和刷新流程。
* **PKCE 流程模拟**。
* 角色验证(管理员 vs 用户访问)。
* 令牌撤销和过期测试。
运行测试:
```
chmod +x ./skrypttest.sh
./skrypttest.sh
```
标签:API 安全, CSV导出, Cutter, DevSecOps, Docker, Express, GNU通用公共许可证, IdP, JSONLines, JSON Web Token, JWKS, JWT, Keycloak, MITM代理, NIDS, Node.js, OAuth 2.0, PKCE, RBAC, SSO, 上游代理, 中间件, 单点登录, 基于角色的访问控制, 子域名突变, 安全认证, 安全防御评估, 容器化, 微服务安全, 授权码注入防护, 请求拦截, 身份提供商, 鉴权, 零信任