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