package utils import ( "errors" "time" "github.com/golang-jwt/jwt/v5" ) // JWTClaims 自定义JWT声明 type JWTClaims struct { UserID uint64 `json:"user_id"` Username string `json:"username"` Role string `json:"role"` jwt.RegisteredClaims } // GenerateToken 生成JWT Token // userID: 用户ID, username: 用户名, role: 角色, secret: 密钥, expirationHours: 过期时间(小时) func GenerateToken(userID uint64, username, role, secret string, expirationHours int) (string, error) { claims := JWTClaims{ UserID: userID, Username: username, Role: role, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(expirationHours) * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "seeyon-filesystem", }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(secret)) } // ParseToken 解析JWT Token func ParseToken(tokenString, secret string) (*JWTClaims, error) { token, err := jwt.ParseWithClaims(tokenString, &JWTClaims{}, func(token *jwt.Token) (interface{}, error) { return []byte(secret), nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(*JWTClaims); ok && token.Valid { return claims, nil } return nil, errors.New("invalid token") }