112 lines
2.4 KiB
Markdown
112 lines
2.4 KiB
Markdown
# JWT 工具层
|
||
|
||
JWT Token生成、解析和验证工具包。
|
||
|
||
## 功能
|
||
|
||
- ✅ JWT Token生成(包含 user_id, star_id, updated_at, exp)
|
||
- ✅ JWT Token解析和验证(签名验证、过期时间检查)
|
||
- ✅ Token过期时间工具函数
|
||
|
||
## 使用方法
|
||
|
||
### 1. 设置密钥(服务启动时调用)
|
||
|
||
```go
|
||
import "github.com/topfans/backend/pkg/jwt"
|
||
|
||
// 从环境变量或配置文件读取密钥
|
||
secret := os.Getenv("JWT_SECRET")
|
||
jwt.SetSecret(secret)
|
||
```
|
||
|
||
### 2. 生成Token
|
||
|
||
```go
|
||
userID := int64(10000001)
|
||
starID := int64(123)
|
||
updatedAt := time.Now().UnixMilli()
|
||
|
||
token, err := jwt.GenerateToken(userID, starID, updatedAt)
|
||
if err != nil {
|
||
// 处理错误
|
||
}
|
||
```
|
||
|
||
### 3. 解析和验证Token
|
||
|
||
```go
|
||
// 解析Token(不验证过期时间,用于刷新Token场景)
|
||
claims, err := jwt.ParseToken(token)
|
||
if err != nil {
|
||
// 处理错误
|
||
}
|
||
|
||
// 验证Token(检查签名和过期时间)
|
||
claims, err := jwt.ValidateToken(token)
|
||
if err != nil {
|
||
// 处理错误
|
||
}
|
||
```
|
||
|
||
### 4. 获取Token中的信息
|
||
|
||
```go
|
||
// 从Token中解析Claims,获取star_id
|
||
claims, err := jwt.ValidateToken(token)
|
||
if err != nil {
|
||
// 处理错误
|
||
}
|
||
|
||
starID := claims.StarID
|
||
userID := claims.UserID
|
||
updatedAt := claims.UpdatedAt
|
||
```
|
||
|
||
**注意**:前端可以直接解析JWT的payload部分(Base64解码)来获取star_id等信息,无需额外拼接。
|
||
|
||
## JWT Claims结构
|
||
|
||
```go
|
||
type Claims struct {
|
||
UserID int64 `json:"user_id"`
|
||
StarID int64 `json:"star_id"`
|
||
UpdatedAt int64 `json:"updated_at"`
|
||
Iat int64 `json:"iat"` // 签发时间
|
||
Exp int64 `json:"exp"` // 过期时间
|
||
}
|
||
```
|
||
|
||
## Token格式
|
||
|
||
- **JWT Token**:标准JWT格式,包含签名
|
||
- **Claims内容**:user_id, star_id, updated_at, iat, exp
|
||
- **前端使用**:直接使用JWT Token,可以从Token中解析出star_id等信息
|
||
|
||
## Token有效期
|
||
|
||
- **默认有效期**:7天
|
||
- **过期后**:需要调用刷新Token接口获取新Token
|
||
|
||
## 安全注意事项
|
||
|
||
1. **密钥管理**:生产环境必须从环境变量或密钥管理服务读取密钥
|
||
2. **HTTPS**:Token必须通过HTTPS传输
|
||
3. **Token存储**:Token存储在数据库中,支持单设备登录
|
||
4. **updated_at验证**:修改密码后,`updated_at`更新,旧Token自动失效
|
||
|
||
## 测试
|
||
|
||
运行测试:
|
||
|
||
```bash
|
||
go test ./pkg/jwt -v
|
||
```
|
||
|
||
测试覆盖:
|
||
- ✅ Token生成和解析
|
||
- ✅ Token过期验证
|
||
- ✅ Token签名验证
|
||
- ✅ 各种错误场景
|
||
|