j
jaryue
V1
2023/04/22阅读:15主题:默认主题
项目1实现登录功能day5
实现图片验证码后半部分,验证码核验
// 图片验证码验证操作:用户传入图片id(唯一标识符发送图片信息时给的),+验证码
func Verifypiccode(db *sql.DB, id string, code string) error {
var created_at time.Time
err := db.QueryRow("SELECT created_at FROM verification_codes WHERE id = ? AND code = ?", id, code).Scan(&created_at)
if err != nil {
return err
}
// 删除验证码
db.Exec("DELETE FROM verification_codes WHERE id = ?", id)
if time.Now().Unix() > created_at.Unix()+5*60 { //时效5分钟
return fmt.Errorf("验证码过期")
}
return nil
}
配置邮件发送服务(gomail)
使用第三方gomail库实现邮件的发送,
我们这里使用QQ邮箱的SMTP来发送邮箱\
首先开启SMTP/IMAP服务
去QQ邮箱的设置中的账号设置中开启,然后获取一个授权码,就可以用了.
// 使用gomail库创建SMTP客户端
func CreatDialer() *gomail.Dialer{
return gomail.NewDialer("smtpHost", smtpPort, "Email", "AuthCode") //smtpHost负责发送邮件的服务器地址,smtpPort端口,授权的邮箱账号,AuthCode为邮箱的授权码,
}
搭建发送邮件服务
func SendEmail(dialer *gomail.Dialer, to, subject, body string) error {
// 发送邮件的QQ邮箱地址
qqEmail := "Email"
// 创建邮件消息
message := gomail.NewMessage()
message.SetHeader("From", qqEmail)
message.SetHeader("To", to)
message.SetHeader("Subject", subject)
message.SetBody("text/plain", body)
// 发送邮件消息
err := dialer.DialAndSend(message)
if err != nil {
panic(err)
}
return nil
}
注册功能实现:
定义简单的输入检验函数:
// 用于检验用户传入的数据是否合理
func Validatedata(data string) bool {
// 正则表达式,匹配长度为 8-20 的 ASCII 字符串
regex := regexp.MustCompile(`^[[:ascii:]]{8,30}$`)
return regex.MatchString(data)
}
//注册1,1. 图片验证,;2. 发送邮件验证码
r.POST("/login1", func(ctx *gee7.Context) {
data := funcmod.Login1data{}
//读取用户传入的json数据
err = ctx.Getjson(&data)
if funcmod.Validatedata(data.Email) {
ctx.FailJson(402, "email不合理,请规划填写数据")
}
if err != nil {
ctx.FailJson(410, "解析数据错误"+err.Error())
return
}
//验证验证码是否正确
err = funcmod.Verifypiccode(db, data.ID, data.Code)
if err != nil {
ctx.FailJson(401, "验证码错误"+err.Error())
return
}
rand.Seed(time.Now().UnixNano())
// 生成100000到999999之间的随机数,作为验证码
verification := rand.Intn(899999) + 100000
//储存验证码到数据库
err = funcmod.InsertVerification(db, &funcmod.EmailVerificationCode{
Email: data.Email,
Verification: verification})
if err != nil {
ctx.FailJson(401, "发送失败,稍后再试"+err.Error())
return
}
//发送验证码
err := funcmod.SendEmail(dailer, data.Email, verification)
err = funcmod.Verifypiccode(db, data.ID, data.Code)
if err != nil {
ctx.FailJson(401, "邮箱错误"+err.Error())
return
}
ctx.JSON(200, gee7.H{
"msg": "ok",
})
})
//login2:1.验证验证码,;2. 向用户列表插入数据
r.POST("/login2", func(ctx *gee7.Context) {
data := funcmod.Logindata{}
//读取用户传入的json数据
err = ctx.Getjson(&data)
if err != nil {
ctx.FailJson(410, "解析数据错误"+err.Error())
return
}
if funcmod.Validatedata(data.Name) {
ctx.FailJson(402, "name不合理,请规划填写数据")
}
if funcmod.Validatedata(data.Password) {
ctx.FailJson(402, "password不合理,请规划填写数据")
}
//验证用户验证码是否正确
err = funcmod.Verify(db, data.Email, data.Verification)
if err != nil {
ctx.FailJson(401, "验证码错误"+err.Error())
return
}
//插入用户数据
err = funcmod.AddLogindata(db, &data)
if err != nil {
ctx.FailJson(401, err.Error())
} else {
ctx.JSON(200, gee7.H{
"msg": "成功",
})
}
})
作者介绍
j
jaryue
V1