Files
goalfylearning-admin/SSO_README.md

198 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SSO 单点登录功能说明
## 概述
本项目已成功集成了单点登录SSO功能参考了 `goalfymax-backend` 项目的实现。SSO功能支持OAuth2/OpenID Connect协议提供完整的认证和授权流程。
## 功能特性
- **OAuth2/OpenID Connect 支持**: 完整的OAuth2授权码流程
- **PKCE 安全增强**: 使用PKCEProof Key for Code Exchange增强安全性
- **令牌管理**: 支持访问令牌和刷新令牌的管理
- **用户会话管理**: 跟踪用户登录状态和在线用户
- **批量操作**: 支持批量用户登出等管理功能
## API 接口
### 1. SSO 登录初始化
```http
POST /api/sso/login
Content-Type: application/json
{}
```
**响应示例:**
```json
{
"code": 200,
"message": "操作成功",
"data": {
"success": true,
"message": "SSO login initiated",
"auth_url": "http://sso-server/oauth2/authorize?...",
"state": "state_1234567890",
"code_verifier": ""
}
}
```
### 2. SSO 回调处理
```http
POST /api/sso/callback
Content-Type: application/json
{
"code": "authorization_code",
"state": "state_1234567890"
}
```
**响应示例:**
```json
{
"code": 200,
"message": "操作成功",
"data": {
"success": true,
"message": "SSO login successful",
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"id_token": "eyJhbGciOiJSUzI1NiIs...",
"refresh_token": "refresh_token_here",
"expires_in": 3600,
"user_info": {
"sub": "123",
"name": "John Doe",
"email": "john@example.com"
},
"uuid": "unique-session-id"
}
}
```
### 3. 刷新令牌
```http
POST /api/sso/refresh
Content-Type: application/json
{
"refresh_token": "your_refresh_token"
}
```
### 4. 用户登出
```http
POST /api/sso/logout
Authorization: Bearer your_access_token
```
### 5. 获取用户信息
```http
GET /api/sso/userinfo
Authorization: Bearer your_access_token
```
### 6. 获取在线用户列表
```http
GET /api/sso/online-users
```
### 7. 获取在线用户数量
```http
GET /api/sso/online-count
```
### 8. 批量用户登出
```http
POST /api/sso/batch-logout
Content-Type: application/json
{
"user_ids": [1, 2, 3]
}
```
## 配置说明
`etc/config.yaml` 中配置SSO相关参数
```yaml
sso:
sso_server_url: "http://localhost:8080" # SSO服务器地址
client_id: "admin-client" # OAuth客户端ID
client_secret: "admin-secret" # OAuth客户端密钥
redirect_uri: "http://localhost:8084/api/sso/callback" # 回调URI
scope: "openid profile email" # 请求的作用域
resource_aud: "admin-api" # 资源受众
timeout: 30s # 请求超时时间
```
## 数据库表结构
### PKCE状态表 (admin_pkce_states)
```sql
CREATE TABLE admin_pkce_states (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
state VARCHAR(255) UNIQUE NOT NULL,
code_verifier TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL
);
```
### 登录信息表 (admin_login_infos)
```sql
CREATE TABLE admin_login_infos (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
user_name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL,
uuid VARCHAR(100) NOT NULL,
is_online BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL
);
```
## 安全特性
1. **PKCE 保护**: 使用PKCE增强OAuth2安全性防止授权码拦截攻击
2. **状态验证**: 使用state参数防止CSRF攻击
3. **令牌验证**: 通过SSO服务器验证令牌有效性
4. **会话管理**: 跟踪用户登录状态,支持强制登出
## 使用流程
1. **前端发起登录**: 调用 `/api/sso/login` 获取授权URL
2. **用户授权**: 用户跳转到SSO服务器进行授权
3. **处理回调**: SSO服务器回调到 `/api/sso/callback`
4. **获取令牌**: 系统自动交换授权码获取访问令牌
5. **用户认证**: 使用访问令牌调用需要认证的API
6. **令牌刷新**: 使用刷新令牌获取新的访问令牌
7. **用户登出**: 调用 `/api/sso/logout` 结束会话
## 测试
使用提供的测试脚本验证SSO功能
```bash
./test_sso_api.sh
```
## 注意事项
1. 确保SSO服务器正常运行并可访问
2. 配置正确的回调URI和客户端凭据
3. 定期清理过期的PKCE状态记录
4. 监控用户登录状态和异常情况
## 扩展功能
- 支持多种认证方式(密码、短信、邮箱等)
- 集成第三方身份提供商Google、GitHub等
- 实现单点登出SLO
- 添加多因素认证MFA
- 实现细粒度权限控制