-1

我试图在 Golang 的 Fiber Farmework 上构建一个登录系统,并使用 Mysql 作为数据库。我可以轻松地散列我的密码,但无法比较给定密码和存储的密码是否相同我使用过

bcrypt.CompareHashAndPassword() 方法..虽然我给出了完全相同的密码,但它仍然给出了错误。请帮我

功能

   func hashAndSalt(password string) string {
    pwd := []byte(password)
    hash, err := bcrypt.GenerateFromPassword(pwd, 14)
    if err != nil {
        log.Println(err)
    }
    return string(hash)
}
func CheckHash(hpass string, pass string) error {
    err := bcrypt.CompareHashAndPassword([]byte(hpass), []byte(pass))
    if err != nil {
        return err
    }
    return nil
}

用户和登录类型

type User struct {
    gorm.Model
    FirstName string `json:"firstname"`
    LastName  string `json:"lastname"`
    Username  string `json:"username"`
    Password  string `json:"-"`
    UserType  string `json:"user_type"`
}
type Log struct {
        Username string `json:"username"`
        Password string `json:"password"`
    }

工作正常的创建用户功能

func CreateUser(c *fiber.Ctx) error {
    user := new(User)
    if err := c.BodyParser(user); err != nil {
        return c.Status(500).SendString(err.Error())
    }
    pass := user.Password
    hashedPass := hashAndSalt(pass)
    user.Password = hashedPass
    DB.Create(&user)
    return c.JSON(&user)
}

登录方法...问题在于哈希检查...

const jwt_secret = "Fahim'sAwesomeSecret"

func Login(c *fiber.Ctx) error {
    type Log struct {
        Username string `json:"username"`
        Password string `json:"password"`
    }
    var body Log
    if err := c.BodyParser(&body); err != nil {
        fmt.Println(err.Error(), "yayy")
        panic(err.Error())
    }

    username := body.Username
    password := body.Password
    var user User
    DB.Where("username = ?", username).First(&user)
    if username != user.Username {
        return c.Status(200).SendString("User not Found , Maybe wrong Username")
    }

    err := CheckHash(user.Password, password)
    if err != nil {
        fmt.Println(err)
        return c.Status(500).SendString("Wrong Password")
    }

    token := jwt.New(jwt.SigningMethodHS256)
    claims := token.Claims.(jwt.MapClaims)

    claims["sub"] = user.ID
    claims["exp"] = time.Now().Add(time.Hour * 24 * 7)
    s, err := token.SignedString([]byte(jwt_secret))
    if err != nil {
        return c.SendStatus(fiber.StatusInternalServerError)
    }
    c.Cookie(&fiber.Cookie{
        Name:     "jwt",
        Value:    s,
        Expires:  time.Now().Add(7 * 24 * time.Hour),
        HTTPOnly: true,
        SameSite: "lax",
    })

    return c.Status(fiber.StatusOK).JSON(fiber.Map{
        "token": s,
        "user":  user,
    })
}

这是我在终端中遇到的错误

crypto/bcrypt: hashedPassword is not the hash of the given password

我已经打印了“user.Password”并给出了存储在数据库中的值。那么问题出在哪里?

4

1 回答 1

-1

我通过将User结构 Password从更改为string来解决它byte

并据此进行了一些更改

于 2021-12-23T19:03:29.793 回答