go - 如何验证密码
问题描述
在这段代码中,第一个函数是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
}
处理程序.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")
}
}
解决方案
根据文档,这是 func 模式bycrypt.CompareHashAndPassword()
:
func CompareHashAndPassword(hashedPassword, password []byte) error
要使用它,您需要将hashedPassword
(存储在数据库中的散列密码)作为第一个参数值。
然后将password
from 请求参数放入第二个参数。
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
推荐阅读
- android - 根据当前位置自动更改货币符号
- c - 我怎样才能重写程序,这样我就不必调用`flex`而只调用`bison`和`cc`?
- c++ - 在 C++ 中混合模板参数和变量时的分支
- aggregate-functions - 如何通过 Tableau 中的聚合按组聚合?
- microservices - Spring 数据流和 GCP Pub Sub
- mysql - 如何在子查询中使用 Count?
- java - 排序图
> 使用 Java 8 - firebase-realtime-database - 为了按距离对地理查询结果进行排序,我必须阅读整个数据集吗?
- wxpython - 没有下拉项目的 wxpython 菜单栏
- php - 如何在 PHP-echo 语句中的 DIV 中编写 CSS 背景标签