package utils import ( "errors" beego "github.com/beego/beego/v2/server/web" "github.com/golang-jwt/jwt/v4" "time" ) type MyClaims struct { UserId uint `json:"user_id"` UserName string `json:"user_name"` jwt.RegisteredClaims } const TokenExpireDuration = time.Hour * 72 var Serect string func CreateToken(userId uint, userName string) (string, error) { Issuer, _ := beego.AppConfig.String("Issuer") Serect, _ = beego.AppConfig.String("mySerect") claims := MyClaims{ UserId: userId, UserName: userName, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(TokenExpireDuration)), Issuer: Issuer, }, } var mySerect = []byte(Serect) token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(mySerect) } func ParseToken(tokenStr string) (*MyClaims, error) { // 使用全局配置中的密钥对token进行解析。 var mySecret = []byte(Serect) // 尝试解析并验证JWT令牌。 claims := new(MyClaims) token, err := jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (interface{}, error) { return mySecret, nil }) if err != nil { if errors.Is(err, jwt.ErrSignatureInvalid) || errors.Is(err, jwt.ErrInvalidKey) { return nil, errors.New("无效的签名或密钥") } else if ve, ok := err.(*jwt.ValidationError); ok && ve.Errors&jwt.ValidationErrorExpired != 0 { return nil, errors.New("令牌已过期") } return nil, err } // 验证令牌是否有效。 if !token.Valid { return nil, errors.New("无效的令牌") } // 如果令牌有效,则返回解析出的声明信息。 return claims, nil }