功能优化:当用户在验证码失效时无法接受验证码解决方案

291 阅读3分钟

功能优化:当用户在验证码失效时无法接受验证码解决方案

在验证码的表中定义了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)
	}
}

示例: 由于我的验证码没有使用且在时间限制内,所以两次验证码是相同的

本文由mdnice多平台发布