package jwt import ( "time" "github.com/golang-jwt/jwt/v5" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" ) // Claims JWT载荷 type Claims struct { UserID uint `json:"user_id"` Username string `json:"username"` UserType string `json:"user_type"` // user, admin jwt.RegisteredClaims } // GenerateToken 生成Token func GenerateToken(userID uint, username, userType string) (string, error) { var ( ctx = gctx.New() signingKey = g.Cfg().MustGet(ctx, "jwt.signingKey").String() expire = g.Cfg().MustGet(ctx, "jwt.expire").Int() ) claims := Claims{ UserID: userID, Username: username, UserType: userType, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(expire) * time.Second)), IssuedAt: jwt.NewNumericDate(time.Now()), NotBefore: jwt.NewNumericDate(time.Now()), }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(signingKey)) } // ParseToken 解析Token func ParseToken(tokenString string) (*Claims, error) { var ( ctx = gctx.New() signingKey = g.Cfg().MustGet(ctx, "jwt.signingKey").String() ) token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) { return []byte(signingKey), nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(*Claims); ok && token.Valid { return claims, nil } return nil, jwt.ErrSignatureInvalid } // RefreshToken 刷新Token func RefreshToken(tokenString string) (string, error) { claims, err := ParseToken(tokenString) if err != nil { return "", err } // 生成新的Token return GenerateToken(claims.UserID, claims.Username, claims.UserType) }