topfans/backend/pkg/jwt/README.md
2026-04-07 22:29:48 +08:00

112 lines
2.4 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.

# 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签名验证
- ✅ 各种错误场景