qnc-server-old/api/middleware.go
2024-12-25 11:59:33 +08:00

107 lines
2.7 KiB
Go

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
}
currentTime := time.Now()
// 检查是否跨午夜
if endTime.Before(startTime) {
// 跨午夜,检查是否在开始时间到午夜,或者午夜到结束时间的范围内
if utils.IsInTimeRange(startTime, time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 23, 59, 59, 0, currentTime.Location())) ||
utils.IsInTimeRange(time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 0, 0, 0, 0, currentTime.Location()), endTime) {
response.FailNotify(c)
c.Abort()
return
}
} else {
// 不跨午夜,按普通情况处理
if utils.IsInTimeRange(startTime, endTime) {
response.FailNotify(c)
c.Abort()
return
}
}
}
c.Next()
}
}