0

Go项目实战之验证码的生成和使用(易扩展方式)【goshop开源项目 | 20220516更新】

 1 month ago
source link: https://studygolang.com/articles/35647
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Go项目实战之验证码的生成和使用(易扩展方式)【goshop开源项目 | 20220516更新】

qiaoshuai951123 · 大约5小时之前 · 46 次点击 · 预计阅读时间 3 分钟 · 大约8小时之前 开始浏览    

goshop开源项目的更新

备注:前面项目中用到的代码已经分享到GitHub中去了,并且以后所有项目中会出现的代码都会提交上去,欢迎查阅。

地址 goshop 感兴趣的可以点个star哦~ goshop开源项目的更新

今天咱们做一个登录功能中的验证码功能

  1. 封装验证码生成,验证码验证等功能,以便多复用

  2. 封装session的中间件

接下来咱们就来实现以上的问题和功能:

  • 先封装验证码业务部分
// 生成验证码
func Captcha(ctx *gin.Context) {
   // 默认验证码生成长度6位
    l := captcha.DefaultLen
    // 这里使用viper读取yaml的配置文件参数
    // w 验证码宽度     h验证码高度     l 验证码生成位数
    w, _ := strconv.Atoi(viper.GetString("captcha.w"))
    h, _ := strconv.Atoi(viper.GetString("captcha.h"))
    l, _ = strconv.Atoi(viper.GetString("captcha.length"))
    // 初始化 验证码长度
    captchaId := captcha.NewLen(l)
    // 开启session
    session := sessions.Default(ctx)
    // 设置session,存储验证码数值
    session.Set("captcha", captchaId)
    // 保存到session
    _ = session.Save()
    // 验证码生成
    _ = Serve(ctx.Writer, ctx.Request, captchaId, ".png", viper.GetString("captcha.lang"), false, w, h)
}

// 验证码的header头设置,生成页面显示
func Serve(w http.ResponseWriter, r *http.Request, id, ext, lang string, download bool, width, height int) error {
    w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
    w.Header().Set("Pragma", "no-cache")
    w.Header().Set("Expires", "0")

    var content bytes.Buffer
    switch ext {
    case ".png":
        w.Header().Set("Content-Type", "image/png")
        _ = captcha.WriteImage(&content, id, width, height)
    case ".wav":
        w.Header().Set("Content-Type", "audio/x-wav")
        _ = captcha.WriteAudio(&content, id, lang)
    default:
        return captcha.ErrNotFound
    }
   // 是否下载验证码
    if download {
        w.Header().Set("Content-Type", "application/octet-stream")
    }
    // 写入到页面中
    http.ServeContent(w, r, id+ext, time.Time{}, bytes.NewReader(content.Bytes()))
    return nil
}

// 验证
func CaptchaVerify(c *gin.Context, code string) bool {
    session := sessions.Default(c)
    if captchaId := session.Get("captcha"); captchaId != nil {
        session.Delete("captcha")
        _ = session.Save()
        // 验证 生成的验证码数值
        if captcha.VerifyString(captchaId.(string), code) {
            return true
        } else {
            return false
        }
    } else {
        return false
    }
}
  • 验证码生成业务代码封装好了,接下来就是如何访问显示生成的验证码图片
// 首先要在对应的route文件中,配置一下路由,进行验证码的生成和显示
authGroup.GET("/captcha", func(ctx *gin.Context) {
    captcha.Captcha(ctx)
})
  • 在对应的登录逻辑中,加入相应的逻辑:
captcha := params["captchaCode"].(string)
// 验证验证码
if !captcha2.CaptchaVerify(ctx, captcha) {
    utils.Fail(ctx, "验证码不正确", nil)
    return
}
  • 接下来:封装一下session中间件
    // 中间件,处理session
    func Session(keyPairs string) gin.HandlerFunc {
      store := SessionConfig()
      return sessions.Sessions(keyPairs, store)
    }
    func SessionConfig() sessions.Store {
      sessionMaxAge := 3600
      sessionSecret := "topgoer"
      var store sessions.Store
      store = cookie.NewStore([]byte(sessionSecret))
      store.Options(sessions.Options{
          MaxAge: sessionMaxAge, //seconds
          Path:   "/",
      })
      return store
    }
    
  • 最后开启一下session
    // 开启session
    r.Use(middleware.Session("topgoer"))
    

说到这里,就全部实现了,验证码的生成,显示,验证,和使用等相关功能!

更多功能请持续关注!!!!!

欢迎各位加我的微信(jobhandsome)跟我一起完成并推动项目的发展!

加入我们.png

有疑问加站长微信联系(非本文作者))

280

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK