// JWT登录鉴权 package utils import ( "simple-memo/global" "time" "github.com/golang-jwt/jwt/v4" ) // Claims 自定义载荷 type Claims struct { UserID uint // 用户ID jwt.RegisteredClaims } // GenerateToken 生成Token func GenerateToken(userID uint) (string, error) { claims := Claims{ UserID: userID, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(global.VP.GetInt("jwt.expire")) * time.Second)), IssuedAt: jwt.NewNumericDate(time.Now()), }, } // 签发 token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(global.VP.GetString("jwt.key"))) } // GenerateTokenWithExpire 生成Token并返回过期时间 func GenerateTokenWithExpire(userID uint) (string, int64, error) { expireSeconds := global.VP.GetInt("jwt.expire") if expireSeconds == 0 { expireSeconds = 7200 // 默认2小时 } expiresAt := time.Now().Add(time.Duration(expireSeconds) * time.Second).UnixMilli() claims := Claims{ UserID: userID, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.UnixMilli(expiresAt)), IssuedAt: jwt.NewNumericDate(time.Now()), }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokenStr, err := token.SignedString([]byte(global.VP.GetString("jwt.key"))) return tokenStr, expiresAt, err } // GetTokenExpireSeconds 获取配置的token过期秒数 func GetTokenExpireSeconds() int64 { expireSeconds := global.VP.GetInt("jwt.expire") if expireSeconds == 0 { return 7200 // 默认2小时 } return int64(expireSeconds) } // GenerateRandomString 生成随机字符串 func GenerateRandomString(length int) string { const charset = "0123456789" b := make([]byte, length) for i := range b { b[i] = charset[global.Rand.Intn(len(charset))] } return string(b) } // ParseToken 解析Token func ParseToken(token string) (*Claims, error) { t, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) { return []byte(global.VP.GetString("jwt.key")), nil }) if err != nil { return nil, err } // 校验 if claims, ok := t.Claims.(*Claims); ok && t.Valid { return claims, nil } return nil, err }