package jwt import ( "errors" "time" gojwt "github.com/golang-jwt/jwt/v5" ) type Claims struct { UserID uint64 `json:"user_id"` Name string `json:"name"` Role string `json:"role"` gojwt.RegisteredClaims } // GenerateTokenPair 生成 access + refresh token func GenerateTokenPair(userID uint64, name, role, secret string, accessExpire, refreshExpire time.Duration) (accessToken, refreshToken string, err error) { accessToken, err = generateToken(userID, name, role, "access", secret, accessExpire) if err != nil { return "", "", err } refreshToken, err = generateToken(userID, name, role, "refresh", secret, refreshExpire) if err != nil { return "", "", err } return } func generateToken(userID uint64, name, role, tokenType, secret string, expire time.Duration) (string, error) { now := time.Now() claims := Claims{ UserID: userID, Name: name, Role: role, RegisteredClaims: gojwt.RegisteredClaims{ ExpiresAt: gojwt.NewNumericDate(now.Add(expire)), IssuedAt: gojwt.NewNumericDate(now), NotBefore: gojwt.NewNumericDate(now), }, } token := gojwt.NewWithClaims(gojwt.SigningMethodHS256, claims) return token.SignedString([]byte(secret)) } // ValidateToken 校验 JWT func ValidateToken(tokenString, secret string) (*Claims, error) { token, err := gojwt.ParseWithClaims(tokenString, &Claims{}, func(token *gojwt.Token) (interface{}, error) { if _, ok := token.Method.(*gojwt.SigningMethodHMAC); !ok { return nil, errors.New("unexpected signing method") } return []byte(secret), nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(*Claims); ok && token.Valid { return claims, nil } return nil, gojwt.ErrInvalidKey }