Spaces:
Paused
Paused
| package api | |
| import ( | |
| "time" | |
| "github.com/gin-gonic/gin" | |
| "pansou/config" | |
| "pansou/util" | |
| ) | |
| // LoginRequest 登录请求结构 | |
| type LoginRequest struct { | |
| Username string `json:"username" binding:"required"` | |
| Password string `json:"password" binding:"required"` | |
| } | |
| // LoginResponse 登录响应结构 | |
| type LoginResponse struct { | |
| Token string `json:"token"` | |
| ExpiresAt int64 `json:"expires_at"` | |
| Username string `json:"username"` | |
| } | |
| // LoginHandler 处理用户登录 | |
| func LoginHandler(c *gin.Context) { | |
| var req LoginRequest | |
| if err := c.ShouldBindJSON(&req); err != nil { | |
| c.JSON(400, gin.H{"error": "参数错误:用户名和密码不能为空"}) | |
| return | |
| } | |
| // 验证认证系统是否启用 | |
| if !config.AppConfig.AuthEnabled { | |
| c.JSON(403, gin.H{"error": "认证功能未启用"}) | |
| return | |
| } | |
| // 验证用户配置是否存在 | |
| if config.AppConfig.AuthUsers == nil || len(config.AppConfig.AuthUsers) == 0 { | |
| c.JSON(500, gin.H{"error": "认证系统未正确配置"}) | |
| return | |
| } | |
| // 验证用户名和密码 | |
| storedPassword, exists := config.AppConfig.AuthUsers[req.Username] | |
| if !exists || storedPassword != req.Password { | |
| c.JSON(401, gin.H{"error": "用户名或密码错误"}) | |
| return | |
| } | |
| // 生成JWT token | |
| token, err := util.GenerateToken( | |
| req.Username, | |
| config.AppConfig.AuthJWTSecret, | |
| config.AppConfig.AuthTokenExpiry, | |
| ) | |
| if err != nil { | |
| c.JSON(500, gin.H{"error": "生成令牌失败"}) | |
| return | |
| } | |
| // 返回token和过期时间 | |
| expiresAt := time.Now().Add(config.AppConfig.AuthTokenExpiry).Unix() | |
| c.JSON(200, LoginResponse{ | |
| Token: token, | |
| ExpiresAt: expiresAt, | |
| Username: req.Username, | |
| }) | |
| } | |
| // VerifyHandler 验证token有效性 | |
| func VerifyHandler(c *gin.Context) { | |
| // 如果未启用认证,直接返回有效 | |
| if !config.AppConfig.AuthEnabled { | |
| c.JSON(200, gin.H{ | |
| "valid": true, | |
| "message": "认证功能未启用", | |
| }) | |
| return | |
| } | |
| // 如果能到达这里,说明中间件已经验证通过 | |
| username, exists := c.Get("username") | |
| if !exists { | |
| c.JSON(401, gin.H{"error": "未授权"}) | |
| return | |
| } | |
| c.JSON(200, gin.H{ | |
| "valid": true, | |
| "username": username, | |
| }) | |
| } | |
| // LogoutHandler 退出登录(客户端删除token即可) | |
| func LogoutHandler(c *gin.Context) { | |
| // JWT是无状态的,服务端不需要处理注销 | |
| // 客户端删除存储的token即可 | |
| c.JSON(200, gin.H{"message": "退出成功"}) | |
| } | |