package jwt import ( "dianshang/internal/config" "errors" "time" "github.com/golang-jwt/jwt/v5" ) // Claims JWT声明结构 type Claims struct { UserID uint `json:"user_id"` UserType string `json:"user_type"` // user, admin jwt.RegisteredClaims } var jwtSecret []byte // Init 初始化JWT func Init(cfg config.JWTConfig) { jwtSecret = []byte(cfg.Secret) } // GenerateToken 生成JWT token func GenerateToken(userID uint, userType string, expire int) (string, error) { nowTime := time.Now() expireTime := nowTime.Add(time.Duration(expire) * time.Second) claims := Claims{ UserID: userID, UserType: userType, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(expireTime), IssuedAt: jwt.NewNumericDate(nowTime), NotBefore: jwt.NewNumericDate(nowTime), Issuer: "dianshang", }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(jwtSecret) } // ParseToken 解析JWT token func ParseToken(tokenString string) (*Claims, error) { token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) { return jwtSecret, nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(*Claims); ok && token.Valid { return claims, nil } return nil, errors.New("invalid token") } // RefreshToken 刷新token func RefreshToken(tokenString string, expire int) (string, error) { claims, err := ParseToken(tokenString) if err != nil { return "", err } // 检查token是否即将过期(剩余时间少于30分钟) if time.Until(claims.ExpiresAt.Time) > 30*time.Minute { return tokenString, nil } // 生成新token return GenerateToken(claims.UserID, claims.UserType, expire) } // ValidateToken 验证token有效性 func ValidateToken(tokenString string) bool { _, err := ParseToken(tokenString) return err == nil }