如何验证密码

How to verify the password

在此代码中,第一个函数是 Findaccount(),它将在数据库中查找电子邮件地址和以哈希形式存在的密码。所以 CompareHashAndPassword() 比较哈希和密码。

现在,在 handler.go 文件中,我有一个名为 loginData() 的函数,它允许用户登录。我这里有一个问题。我调用了 database.Findaccount(email, password, hash) 函数,但它只验证了一个电子邮件地址,并没有验证 正确的密码,然后给我 false 消息。

但是如果我像这样调用函数 database.Findaccount(email, "1234", hash),它会同时验证电子邮件和密码。

如何解决这个问题,因为我将无法记住每个密码。

db.go

func Findaccount(myEmail, myPassword, hash string) bool {
    collection := Connect.Database("WebApp2").Collection("dataStored")
    if err := collection.FindOne(context.TODO(), bson.M{"email": myEmail}).Decode(&Account); err != nil {
        fmt.Println("Enter the correct email or password")
    }
    err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(myPassword))
    return err == nil
}

handler.go

func HashPassword(password string) (string, error) {
    bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
    return string(bytes), err
}

func loginData(w http.ResponseWriter, r *http.Request) {
    email := r.FormValue("email")
    password := r.FormValue("password")
    hash, _ := HashPassword(password)
    match := database.Findaccount(email, password, hash) // here is a problem
    if match == false {
        fmt.Println("false")
    } else {
        fmt.Println("true")
    }
}

根据documentation,这是bycrypt.CompareHashAndPassword()的函数模式:

func CompareHashAndPassword(hashedPassword, password []byte) error

要使用它,您需要将 hashedPassword(存储在数据库中的散列密码)作为第一个参数值。

然后把请求参数中的password放到第二个参数中

func loginData(w http.ResponseWriter, r *http.Request) {
    email := r.FormValue("email")
    password := r.FormValue("password")
    match := database.Findaccount(email, password)
    if match == false {
        fmt.Println("false")
    } else {
        fmt.Println("true")
    }
}

func Findaccount(myEmail, myPassword string) bool {
    collection := Connect.Database("WebApp2").Collection("dataStored")
    if err := collection.FindOne(context.TODO(), bson.M{"email": myEmail}).Decode(&Account); err != nil {
        fmt.Println("Enter the correct email or password")
    }
    err := bcrypt.CompareHashAndPassword([]byte(Account.Password), []byte(myPassword))
    return err == nil
}

参见Findaccount(),语句bcrypt.CompareHashAndPassword()的第一个参数由Account.Password填充,这是存储在数据库中的散列密码。