|
|
||
|---|---|---|
| .idea | ||
| .vscode | ||
| gateway | ||
| nginx | ||
| oidc | ||
| resourceservice | ||
| resourceserviceb | ||
| resourceservicehtml | ||
| resourceservicehtmlb | ||
| ssl | ||
| .cursorrules | ||
| .gitignore | ||
| README.md | ||
| database.md | ||
| de.md | ||
| index.html | ||
| install-key.pem | ||
| install.pem | ||
| oauth2.md | ||
| oidc.md | ||
| request.md | ||
| token.txt | ||
README.md
OAuth2/OIDC 统一认证系统
这是一个基于Spring Boot的多服务架构,使用OAuth2和OIDC实现统一认证。
系统架构
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端应用 │ │ 网关服务 │ │ 资源服务 │
│ (a.sun.com) │───▶│ (8080) │───▶│ (8081) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ OIDC服务器 │ │ JWT验证 │ │ 受保护资源 │
│ (9000) │ │ Token转发 │ │ API端点 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
服务组件
1. OIDC授权服务器 (oidc/)
- 端口: 9000
- 功能: OAuth2/OIDC授权服务器
- 客户端配置:
- 客户端ID:
a-client - 客户端密钥:
a-secret - 重定向URI:
http://a.sun.com/callback - 授权类型:
authorization_code,refresh_token - 作用域:
openid,read
- 客户端ID:
2. 网关服务 (gateway/)
- 端口: 8080
- 功能: API网关,JWT验证,Token转发
- 特性:
- JWT Token验证
- 路由转发到后端服务
- Token Relay功能
3. 资源服务 (resourceservice/)
- 端口: 8081
- 功能: 后端API服务
- 端点:
/api/resource(GET)
4. 前端应用 (resourceservicehtml/)
- 域名: a.sun.com
- 功能: 用户界面,OIDC登录流程
- 页面:
index.html: 主页面,包含登录和API调用功能callback.html: OIDC回调处理页面test.html: 配置测试页面
认证流程
1. 用户登录流程
- 用户访问
http://a.sun.com - 前端检查本地Token
- 如果没有Token,重定向到OIDC登录页面
- 用户在OIDC服务器登录
- OIDC服务器重定向回
http://a.sun.com/callback - 前端用授权码交换Token
- Token保存到本地存储
2. API调用流程
- 前端使用Token调用
/api/resource - 请求经过nginx代理到网关
- 网关验证JWT Token
- 网关转发请求到资源服务
- 资源服务返回数据
配置说明
OIDC服务器配置
- 使用内存存储用户和客户端
- 默认用户:
user/password - RSA密钥对用于JWT签名
网关配置
- WebFlux架构
- JWT Token验证
- 路由配置指向资源服务
前端配置
- OIDC客户端配置
- Token本地存储
- 状态参数防CSRF攻击
启动顺序
-
启动OIDC服务器:
cd oidc mvn spring-boot:run -
启动网关服务:
cd gateway mvn spring-boot:run -
启动资源服务:
cd resourceservice mvn spring-boot:run -
配置nginx:
sudo cp resourceservicehtml/nginx.conf /opt/homebrew/etc/nginx/nginx.conf sudo nginx -s reload -
配置hosts:
127.0.0.1 a.sun.com 127.0.0.1 oidc.sun.com
测试
1. 访问前端
- 主页:
http://a.sun.com - 测试页面:
http://a.sun.com/test.html
2. 测试OIDC端点
- JWKS:
http://localhost:9000/oauth2/jwks - 授权端点:
http://localhost:9000/oauth2/authorize - Token端点:
http://localhost:9000/oauth2/token
3. 测试API
- 资源API:
http://a.sun.com/api/resource
安全特性
- JWT Token验证
- 状态参数防CSRF攻击
- HTTPS重定向支持
- Token过期处理
- 刷新Token机制
故障排除
常见问题
-
OIDC发现端点无法访问
- 检查OIDC服务器是否启动
- 验证安全配置
-
Token验证失败
- 检查Token是否过期
- 验证JWT签名
-
nginx权限问题
- 确保nginx用户有读取权限
- 检查目录权限设置
-
CORS问题
- 检查前端域名配置
- 验证重定向URI设置
开发说明
添加新客户端
在 oidc/src/main/java/com/tuoheng/oauth/oidc/config/SecurityConfig.java 中添加新的 RegisteredClient。
添加新API端点
在 resourceservice 中添加新的Controller和端点。
修改前端配置
在 resourceservicehtml/index.html 中修改 oidcConfig 对象。
技术栈
- 后端: Spring Boot 3.x, Spring Security, Spring Cloud Gateway
- 前端: HTML5, JavaScript, CSS3
- 认证: OAuth2, OpenID Connect, JWT
- 代理: nginx
- 构建: Maven
版本信息
- Spring Boot: 3.5.3
- Spring Security: 6.5.1
- Spring Cloud Gateway: 4.1.1
- Java: 17
mkcert -uninstall && mkcert -install && mkcert -key-file ssl/private.key -cert-file ssl/certificate.crt "*.local.com" local.com