package utils import ( "GinTutorial/config" "errors" "fmt" "time" "github.com/golang-jwt/jwt/v5" "golang.org/x/crypto/bcrypt" ) func HashPassword(password string) (string, error) { hash, err := bcrypt.GenerateFromPassword([]byte(password), config.AppConfig.Bcrypt.Cost) return string(hash), err } func GenerateJWT(username string) (string, error) { token := jwt.NewWithClaims(jwt.SigningMethodHS512, jwt.MapClaims{ "username": username, "exp": time.Now().Add(time.Hour * 72).Unix(), }) signedToken, err := token.SignedString([]byte(config.AppConfig.Jwtconfig.Secret)) return "Bearer " + signedToken, err } func CheckPassword(password, hash string) bool { err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) return err == nil } func ParseToken(tokenString string) (string, error) { if len(tokenString) > 7 && tokenString[0:7] == "Bearer " { tokenString = tokenString[7:] } token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return []byte(config.AppConfig.Jwtconfig.Secret), nil }) if err != nil { return "", err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { username, ok := claims["username"].(string) if !ok { return "", errors.New("username invalid") } return username, nil } return "", errors.New("token invalid") }