161 lines
3.3 KiB
Markdown
161 lines
3.3 KiB
Markdown
# JWT认证使用说明
|
||
|
||
## 概述
|
||
|
||
系统已从手动传递操作者信息的头部参数改为使用JWT(JSON Web Token)进行身份认证。这种方式更加安全、标准化,并且符合REST API的最佳实践。
|
||
|
||
## 认证流程
|
||
|
||
### 1. 用户登录获取JWT令牌
|
||
|
||
```http
|
||
POST /api/auth/login
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"username": "your_username",
|
||
"password": "your_password"
|
||
}
|
||
```
|
||
|
||
响应示例:
|
||
```json
|
||
{
|
||
"token": "eyJhbGciOiJIUzI1NiJ9...",
|
||
"userType": "AGENT",
|
||
"userId": 123,
|
||
"username": "your_username"
|
||
}
|
||
```
|
||
|
||
### 2. 使用JWT令牌调用受保护的接口
|
||
|
||
在请求头中添加 `Authorization` 头:
|
||
|
||
```http
|
||
POST /api/link/generate
|
||
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"times": 10,
|
||
"linkCount": 5
|
||
}
|
||
```
|
||
|
||
## 链接生成接口
|
||
|
||
### 接口地址
|
||
`POST /api/link/generate`
|
||
|
||
### 请求头
|
||
- `Authorization: Bearer {JWT_TOKEN}` - 必需,JWT认证令牌
|
||
- `Content-Type: application/json` - 必需
|
||
|
||
### 请求参数
|
||
```json
|
||
{
|
||
"times": 10, // 本次打脚本的次数
|
||
"linkCount": 5 // 生成多少个链接
|
||
}
|
||
```
|
||
|
||
### 响应示例
|
||
```json
|
||
{
|
||
"batchId": 456,
|
||
"deductPoints": 50,
|
||
"expireAt": "2024-01-15T16:30:00",
|
||
"codeNos": ["ABC12345", "DEF67890", ...]
|
||
}
|
||
```
|
||
|
||
## 权限控制
|
||
|
||
### 代理用户
|
||
- 只能为自己生成链接
|
||
- 必须检查积分余额
|
||
- 生成链接时扣除相应积分
|
||
|
||
### 管理员用户
|
||
- 只能为自己生成链接
|
||
- 跳过积分检查
|
||
- 不扣除积分
|
||
|
||
## 安全特性
|
||
|
||
1. **JWT令牌验证**:每个请求都会验证JWT令牌的有效性
|
||
2. **自动过期**:JWT令牌有自动过期时间(默认30分钟)
|
||
3. **用户身份验证**:从JWT中自动提取用户ID、用户类型等信息
|
||
4. **权限控制**:基于用户类型进行不同的业务逻辑处理
|
||
|
||
## 错误处理
|
||
|
||
### 常见错误
|
||
|
||
1. **缺少认证令牌**
|
||
```json
|
||
{
|
||
"error": "用户未认证"
|
||
}
|
||
```
|
||
|
||
2. **令牌无效或过期**
|
||
```json
|
||
{
|
||
"error": "JWT token validation failed"
|
||
}
|
||
```
|
||
|
||
3. **权限不足**
|
||
```json
|
||
{
|
||
"error": "非法操作者类型"
|
||
}
|
||
```
|
||
|
||
## 技术实现
|
||
|
||
### 核心组件
|
||
|
||
1. **JwtService**:JWT令牌的生成和解析
|
||
2. **JwtAuthenticationFilter**:自动处理JWT认证的Web过滤器
|
||
3. **SecurityConfig**:Spring Security配置,定义哪些接口需要认证
|
||
4. **LinkController**:使用Spring Security上下文获取用户信息
|
||
|
||
### 认证流程
|
||
|
||
```
|
||
请求 → JwtAuthenticationFilter → JWT解析 → 创建认证对象 → Spring Security上下文 → 控制器获取用户信息
|
||
```
|
||
|
||
## 迁移说明
|
||
|
||
### 从旧版本迁移
|
||
|
||
如果您之前使用的是手动传递操作者信息的头部参数:
|
||
|
||
**旧方式(已废弃):**
|
||
```http
|
||
X-Operator-Id: 123
|
||
X-Operator-Type: AGENT
|
||
```
|
||
|
||
**新方式:**
|
||
```http
|
||
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
|
||
```
|
||
|
||
### 兼容性
|
||
|
||
- 旧的头参数方式已被完全移除
|
||
- 所有链接相关接口现在都需要JWT认证
|
||
- 确保在调用接口前先获取有效的JWT令牌
|
||
|
||
## 最佳实践
|
||
|
||
1. **令牌管理**:客户端应妥善保存JWT令牌,并在过期前刷新
|
||
2. **安全传输**:始终使用HTTPS传输JWT令牌
|
||
3. **错误处理**:客户端应处理认证失败的情况,引导用户重新登录
|
||
4. **日志记录**:系统会自动记录所有认证相关的操作日志
|