package api import ( "errors" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" "log" "qnc-server/config" "qnc-server/model/response" "qnc-server/utils" "strconv" "time" ) func JWTAuth() gin.HandlerFunc { return func(c *gin.Context) { token := utils.GetToken(c) if token == "" { response.NoAuth("未登录", c) c.Abort() return } j := utils.NewJWT() // parseToken 解析token包含的信息 claims, err := j.ParseToken(token) if err != nil { if errors.Is(err, utils.TokenExpired) { response.NoAuth("授权已过期", c) utils.ClearToken(c) c.Abort() return } response.NoAuth(err.Error(), c) utils.ClearToken(c) c.Abort() return } if claims.Disable { response.Fail(c) c.Abort() return } c.Set("claims", claims) if claims.ExpiresAt.Unix()-time.Now().Unix() < claims.BufferTime { dr, _ := utils.ParseDuration(config.ConfigData.JWT.ExpiresTime) claims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(dr)) newToken, _ := j.CreateTokenByOldToken(token, *claims) newClaims, _ := j.ParseToken(newToken) c.Header("new-token", newToken) c.Header("new-expires-at", strconv.FormatInt(newClaims.ExpiresAt.Unix(), 10)) utils.SetToken(c, newToken, int(dr.Seconds())) } c.Next() if newToken, exists := c.Get("new-token"); exists { c.Header("new-token", newToken.(string)) } if newExpiresAt, exists := c.Get("new-expires-at"); exists { c.Header("new-expires-at", newExpiresAt.(string)) } } } // NotifyMiddleware 中间件 func NotifyMiddleware() gin.HandlerFunc { return func(c *gin.Context) { if config.ConfigData.Notify.Switch { startTime, err := utils.ParseTime(config.ConfigData.Notify.StartTime) if err != nil { log.Printf("【通知中间件】起始时间解析错误:%v", err) c.Next() return } endTime, err := utils.ParseTime(config.ConfigData.Notify.EndTime) if err != nil { log.Printf("【通知中间件】结束时间解析错误:%v", err) c.Next() return } if utils.IsInTimeRange(startTime, endTime) { response.FailNotify(c) c.Abort() return } } c.Next() } }