一文搞懂Go整合captcha实现验证码功能

网友投稿 1011 2022-11-16

一文搞懂Go整合captcha实现验证码功能

最近在使用Go语言搞一个用户登录&注册的功能,说到登录&注册相关,我们油然会产生一种增加验证码的想法,因此着手实现,后来在GitHub上找到了这个名叫captcha的插件,于是就利用文档进行了初步的学习,并融入到自己的项目中,整个过程下来感觉这个插件的设计非常巧妙,所以就想写一篇文章分享一下,通过本篇文章,你会学到:

1 captcha概述

GitHub:实现代码(使用内存缓存)

2.1 后端代码

生成验证码图片API:

//GenerateImg 生成验证码图片名称func GenerateImg(w req *{ w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域 w.Header().Add("Access-Control-Allow-Headers", "Content-Type") d := struct { CaptchaId string }{ captcha.New(), } bytes, _ := json.Marshal(map[string]interface{}{"code": 0, "msg": "", "count": 0, "data": d.CaptchaId}) w.Write(bytes)}

HTTP服务:

func RunHttp(port string) { logger := log.Default() "*") controller.UserLogin) //登录API controller.GenerateImg) //生成验证码图片API captcha.Server(captcha.StdWidth, captcha.StdHeight)) //刷新验证码API logger.Println("Http Server Running port:", port, "...") nil)}

启动HTTP服务:

func main() { web.RunHttp("8000")}

验证码验证:

//UserLogin 用户登录func UserLogin(w req *{ w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Add("Access-Control-Allow-Headers", "Content-Type") ...... var m map[string]string body, err := ioutil.ReadAll(req.Body) if err != nil { panic(err) } json.Unmarshal(body, &m) var k = m["verify_key"] var v = m["verify_value"] res := captcha.VerifyString(k, v) if res { // 验证通过 ...... } else { // 验证未通过 ...... } ......}

2.2 前端代码

......

登录

......

2.3 注意点

跨域问题:可加入如下代码

w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域w.Header().Add("Access-Control-Allow-Headers", "Content-Type")

3 自定义Store(使用Redis缓存)

3.1 自定义对象并实现Store抽象

Redis初始化:

var ( RDB *redis.Client TokenTimeOut = time.Second * 3600)func init() { RDB = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "", DB: 0, })}

自定义结构体&实现Store抽象:

type StoreImpl struct { RDB *redis.Client Expiration time.Duration}func (impl *StoreImpl) Set(id string, digits []byte) { impl.RDB.Set(context.Background(), id, string(digits), impl.Expiration)}func (impl *StoreImpl) Get(id string, clear bool) (digits []byte) { bytes, _ := impl.RDB.Get(context.Background(), id).Bytes() return bytes}

3.2 配置captcha,加入自定义Store实现

//GenerateImg 生成验证码图片名称func GenerateImg(w req *{ w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域 w.Header().Add("Access-Control-Allow-Headers", "Content-Type") //header的类型 //需要在New之前进行指定 captcha.SetCustomStore(&verify.StoreImpl{ RDB: dao.RDB, Expiration: time.Second * 1000, }) d := struct { CaptchaId string }{ captcha.New(), } bytes, _ := json.Marshal(map[string]interface{}{"code": 0, "msg": "", "count": 0, "data": d.CaptchaId}) w.Write(bytes)}

3.3 注意点

需要在captcha.New()之前进行captcha.SetCustomStore()在captcha.SetCustomStore()之后,自定义的方法实现Store接口时需要完整实现,也就是能真正的实现存储或缓存功能,否则验证码无法生成

参考:

​​https://github.com/dchest/captcha/blob/master/capexample/main.go​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:四剑客与Code Review的恩怨情仇:“始乱终弃”到“浪子回头”
下一篇:《MySQL高级篇》二、逻辑架构分析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~