package tokenlib import ( "admin/internal/errcode" "fmt" "github.com/golang-jwt/jwt/v5" "strconv" "time" ) type RegisteredTokenClaims struct { User string `json:"user,omitempty"` jwt.RegisteredClaims } var ( tokenSign = []byte("token_sign") // token加盐 ) func ValidToken(token string, userId int) error { checkToken, err := jwt.ParseWithClaims(token, &RegisteredTokenClaims{}, func(token *jwt.Token) (interface{}, error) { return tokenSign, nil }) if err != nil { return errcode.New(errcode.TokenInvalid, "ParseWithClaims token (%v) error:%v", token, err) } if !checkToken.Valid { return errcode.New(errcode.TokenInvalid, "ParseWithClaims token (%v) invalid", token) } claims := checkToken.Claims.(*RegisteredTokenClaims) if claims.User != strconv.Itoa(userId) { return errcode.New(errcode.TokenInvalid, "token:%v extract user:%v not equal header give id:%v", token, claims.User, userId) } return nil } func GenToken(userId int, expire time.Duration) (string, error) { user := strconv.Itoa(userId) claims := &RegisteredTokenClaims{ User: user, } jwtClaims := jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(expire)), Issuer: "test", } claims.RegisteredClaims = jwtClaims token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) ss, err := token.SignedString(tokenSign) if err != nil { return "", fmt.Errorf("token SignedString error:%v", err) } return ss, nil }