package service import ( "context" "time" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/util/gconv" "github.com/golang-jwt/jwt/v5" ) type sAuth struct{} var Auth = sAuth{} // Claims JWT声明 type Claims struct { UserId uint64 `json:"user_id"` Username string `json:"username"` jwt.RegisteredClaims } // GenerateToken 生成JWT Token func (s *sAuth) GenerateToken(ctx context.Context, userId uint64) (string, error) { // 获取JWT配置 jwtConfig := g.Cfg().MustGet(ctx, "jwt") signingKey := jwtConfig.Map()["signingKey"].(string) expire := gconv.Int64(jwtConfig.Map()["expire"]) // 创建声明 claims := Claims{ UserId: userId, Username: "", // 将在后续获取 RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(expire) * time.Second)), IssuedAt: jwt.NewNumericDate(time.Now()), NotBefore: jwt.NewNumericDate(time.Now()), Issuer: "cms-api", Subject: gconv.String(userId), }, } // 创建token token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 签名token tokenString, err := token.SignedString([]byte(signingKey)) if err != nil { return "", gerror.New("生成Token失败") } return tokenString, nil } // ParseToken 解析JWT Token func (s *sAuth) ParseToken(ctx context.Context, tokenString string) (*Claims, error) { // 获取JWT配置 jwtConfig := g.Cfg().MustGet(ctx, "jwt") signingKey := jwtConfig.Map()["signingKey"].(string) // 解析token token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) { return []byte(signingKey), nil }) if err != nil { return nil, gerror.New("Token解析失败") } if claims, ok := token.Claims.(*Claims); ok && token.Valid { return claims, nil } return nil, gerror.New("Token无效") } // ValidateToken 验证Token func (s *sAuth) ValidateToken(ctx context.Context, tokenString string) (uint64, error) { claims, err := s.ParseToken(ctx, tokenString) if err != nil { return 0, err } // 检查管理员是否存在且状态正常 admin, err := Admin().GetById(ctx, int(claims.UserId)) if err != nil { return 0, gerror.New("管理员不存在") } if admin == nil || admin.Status != 1 { return 0, gerror.New("管理员已被禁用") } return claims.UserId, nil } // RefreshToken 刷新Token func (s *sAuth) RefreshToken(ctx context.Context, tokenString string) (string, error) { claims, err := s.ParseToken(ctx, tokenString) if err != nil { return "", err } // 生成新的Token return s.GenerateToken(ctx, claims.UserId) } // GetTokenExpire 获取Token过期时间 func (s *sAuth) GetTokenExpire(ctx context.Context) int { jwtConfig := g.Cfg().MustGet(ctx, "jwt") return gconv.Int(jwtConfig.Map()["expire"]) }