j
jaryue
V1
2023/04/29阅读:15主题:默认主题
功能优化:当用户在验证码失效时无法接受验证码解决方案
功能优化:当用户在验证码失效时无法接受验证码解决方案
在验证码的表中定义了time(是否经过验证)属性,我们通过time为0或者1来判断用户在发送验证码的期间是否有验证,
如果没有验证,并且验证码时间在指定时间之内(我们这里定义30min),那么再次发送的验证码将于之前发送的验证码相同
其他情况都重新生成验证码并发送
// 获取验证码
// 检查是否进行验证过,用于重新发送验证码时调用,检查用户是否验证过
// 如果没有就发送与原来相同的验证码,否则就发送新验证码
func GetuVerification(db *sql.DB, email string) int {
// 查询验证码是否正确
var expirationTime int64 //储存过期时间
verification, t := 0, 0
err := db.QueryRow("SELECT time, Verification, ExpirationTime FROM VerificationCode WHERE Email = ?", email).Scan(&t, &verification, &expirationTime)
//当没有验证码发送记录||已经验证过||超出时间限制(因为expirationTime为过期时间,为生成的5分钟之后,所以加上25分钟正好30分钟) 则需要重新生成验证码
if err != nil || t == 1 || expirationTime+25*60 < time.Now().Unix() {
rand.Seed(time.Now().UnixNano())
// 生成100000到999999之间的随机数,作为验证码
return rand.Intn(899999) + 100000
} else {
return verification
}
}
需要发送验证码的响应函数更改
r.POST("/login1", func(ctx *gee7.Context) {
data := funcmod.Login1data{}
//读取用户传入的json数据
err = ctx.Getjson(&data)
if err != nil {
ctx.Returnfunc(410, "解析数据错误"+err.Error(), nil)
return
}
if funcmod.Validatedata(data.Email) {
ctx.Returnfunc(402, "email不合理,请规范填写数据", nil)
}
//验证图片验证码是否正确
err = funcmod.Verifypiccode(db, data.PicID, data.PicCode)
if err != nil {
ctx.Returnfunc(401, "验证码错误"+err.Error(), nil)
return
}
_, err = funcmod.GetuserId(db, data.Email)
if err == nil {
ctx.Returnfunc(410, "账号已经注册了", nil)
return
}
verification := funcmod.GetuVerification(db, data.Email)
//储存验证码到数据库
err = funcmod.InsertVerification(db, &funcmod.EmailVerificationCode{
Email: data.Email,
Verification: verification})
if err != nil {
ctx.Returnfunc(401, "发送失败,稍后再试"+err.Error(), nil)
return
}
//发送验证码
err = funcmod.SendEmail(dailer, data.Email, verification)
if err != nil {
ctx.Returnfunc(401, "发送失败"+err.Error(), nil)
return
}
ctx.Returnfunc(200, "ok", nil)
})
// 登录第一步:1. 图片验证,;2. 发送邮件验证码
func SigninByEmail1(db *sql.DB, dialer *gomail.Dialer) gee7.HandlerFunc {
return func(ctx *gee7.Context) {
data := funcmod.Signupbyemail1{}
//读取用户传入的json数据
err := ctx.Getjson(&data)
if err != nil {
ctx.Returnfunc(410, "解析数据错误"+err.Error(), nil)
return
}
if funcmod.Validatedata(data.Email) {
ctx.Returnfunc(402, "email不合理,请规范填写数据", nil)
}
//验证图片验证码是否正确
err = funcmod.Verifypiccode(db, data.PicID, data.PicCode)
if err != nil {
ctx.Returnfunc(401, "验证码错误"+err.Error(), nil)
return
}
_, err = funcmod.GetuserId(db, data.Email)
if err != nil {
ctx.Returnfunc(410, "账号未注册注册,请先注册", nil)
return
}
//获取验证码函数
verification := funcmod.GetuVerification(db, data.Email)
//储存验证码到数据库
err = funcmod.InsertVerification(db, &funcmod.EmailVerificationCode{
Email: data.Email,
Verification: verification})
if err != nil {
ctx.Returnfunc(401, "发送失败,稍后再试"+err.Error(), nil)
return
}
//发送验证码
err = funcmod.SendEmail(dialer, data.Email, verification)
if err != nil {
ctx.Returnfunc(401, "邮箱错误"+err.Error(), nil)
return
}
ctx.Returnfunc(200, "ok", gee7.H{
"msg": "ok",
})
}
}
// 验证改密第一步:1. 图片验证,;2. 发送邮件验证码
func ResetpaswByEmail1(db *sql.DB, dialer *gomail.Dialer, signinlest SignInList) gee7.HandlerFunc {
return func(ctx *gee7.Context) {
data := ResetpaswbyemailData1{}
//读取用户传入的Returnfunc数据
err := ctx.Getjson(&data)
if err != nil {
ctx.Returnfunc(410, err.Error(), nil)
return
}
if signinlest[data.IDcode] == nil {
ctx.Returnfunc(402, "非法访问", nil)
return
}
ctx.Userid = signinlest[data.IDcode].ID
//验证图片验证码是否正确
err = Verifypiccode(db, data.PicID, data.PicCode)
if err != nil {
ctx.Returnfunc(401, "图片验证码错误"+err.Error(), nil)
return
}
// 验证成功:获取用户邮箱
emial, err := GetuserEmail(db, signinlest[data.IDcode].ID)
if err != nil {
ctx.Returnfunc(410, "未找到邮箱信息,请联系管理员"+err.Error(), nil)
}
verification := GetuVerification(db, emial)
//储存验证码到数据库
err = InsertVerification(db, &EmailVerificationCode{
Email: emial,
Verification: verification})
if err != nil {
ctx.Returnfunc(401, "发送失败,稍后再试"+err.Error(), nil)
return
}
//发送验证码
err = SendEmail(dialer, emial, verification)
if err != nil {
ctx.Returnfunc(401, "邮箱错误"+err.Error(), nil)
return
}
ctx.Returnfunc(200, "ok", nil)
}
}
示例: 由于我的验证码没有使用且在时间限制内,所以两次验证码是相同的
作者介绍
j
jaryue
V1