package utils import ( commonConfig "base-framework/pkg/config" "errors" "time" "github.com/golang-jwt/jwt" ) var ( ErrTokenExpired = errors.New("token expired") ErrTokenInvalid = errors.New("token invalid") ) // CustomClaims 定义自己的 payload 结构 type CustomClaims struct { OrgID string `json:"org_id"` UserID string `json:"user_id"` jwt.StandardClaims } // CreateToken 创建一个 JWT token func CreateToken(orgID, userID string) (string, error) { expireTime := time.Now().Add(commonConfig.JWT.Expiry).Unix() claims := CustomClaims{ OrgID: orgID, UserID: userID, StandardClaims: jwt.StandardClaims{ ExpiresAt: expireTime, IssuedAt: time.Now().Unix(), }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) signKey := []byte(commonConfig.JWT.Secret) return token.SignedString(signKey) } // VerifyToken 验证并解析 JWT token func VerifyToken(tokenString string) (*CustomClaims, error) { signKey := []byte(commonConfig.JWT.Secret) token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { // 校验签名算法 if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, ErrTokenInvalid } return signKey, nil }) if err != nil { // 判断是否过期错误 if ve, ok := err.(*jwt.ValidationError); ok { if ve.Errors&jwt.ValidationErrorExpired != 0 { return nil, ErrTokenExpired } } return nil, ErrTokenInvalid } if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid { return claims, nil } return nil, ErrTokenInvalid }