Go语言简易图像验证码生成的实战案例

 更新时间:2025年08月14日 09:57:50   作者:程序员爱钓鱼  
本篇我们将使用Go语言结合第三方库 github.com/mojocn/base64Captcha,快速实现一个简易图像验证码生成接口,具有一定的参考价值,感兴趣的可以了解一下

在 Web 应用中,验证码(CAPTCHA)常用于防止机器人批量提交请求,比如注册、登录、评论等功能。 本篇我们将使用 Go 语言和 Gin 框架,结合第三方库 github.com/mojocn/base64Captcha,快速实现一个简易图像验证码生成接口

一、功能目标

  1. 提供一个生成验证码的 API,返回验证码图片(Base64 编码)和验证码 ID。
  2. 前端展示验证码图片,并在提交时携带验证码 ID 和用户输入。
  3. 提供一个校验验证码的 API。

二、安装依赖

首先安装 Gin 和 Base64Captcha:

go get github.com/gin-gonic/gin
go get github.com/mojocn/base64Captcha

三、代码实现

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/mojocn/base64Captcha"
	"net/http"
)

// 验证码存储在内存中(也可以换成 Redis)
var store = base64Captcha.DefaultMemStore

// 生成验证码
func generateCaptcha(c *gin.Context) {
	driver := base64Captcha.NewDriverDigit(80, 240, 5, 0.7, 80) // 高度80, 宽度240, 5位数字
	captcha := base64Captcha.NewCaptcha(driver, store)
	id, b64s, err := captcha.Generate()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "验证码生成失败"})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"captcha_id":   id,
		"captcha_image": b64s, // Base64 编码的图片
	})
}

// 校验验证码
func verifyCaptcha(c *gin.Context) {
	var req struct {
		ID    string `json:"id"`
		Value string `json:"value"`
	}
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	if store.Verify(req.ID, req.Value, true) { // true 表示验证成功后清除
		c.JSON(http.StatusOK, gin.H{"message": "验证成功"})
	} else {
		c.JSON(http.StatusBadRequest, gin.H{"message": "验证码错误"})
	}
}

func main() {
	r := gin.Default()
	r.GET("/captcha", generateCaptcha)
	r.POST("/verify", verifyCaptcha)
	r.Run(":8080")
}

四、运行与测试

运行服务:

go run main.go

1. 获取验证码

curl http://localhost:8080/captcha

返回:

{
  "captcha_id": "ZffX7Xr7EccGdS4b",
  "captcha_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhE..."
}

前端可直接用 <img src="captcha_image" /> 渲染验证码。

2. 校验验证码

curl -X POST http://localhost:8080/verify \
  -H "Content-Type: application/json" \
  -d '{"id":"ZffX7Xr7EccGdS4b","value":"12345"}'

五、注意事项

  1. 验证码存储

    • 本示例使用内存存储,适合单机开发环境。
    • 生产环境建议使用 Redis 等共享存储。
  2. 验证码类型 base64Captcha 支持数字、字母混合、中文等类型,可以根据业务需求选择不同 Driver

  3. 安全性

    • 不能把验证码 ID 暴露给爬虫(可配合 CSRF、限流等手段)。
    • 验证码要有有效期,防止重放攻击。

六、总结

使用 base64Captcha 结合 Gin,可以非常方便地生成和校验验证码。 本篇示例已经可以直接应用到注册、登录等防刷场景中。

到此这篇关于Go语言简易图像验证码生成的实战案例的文章就介绍到这了,更多相关Go语言图像验证码生成内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 图文详解go语言反射实现原理

    图文详解go语言反射实现原理

    这篇文章主要介绍了图文详解go语言反射实现原理,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧,需要的朋友可以参考下
    2020-02-02
  • Golang中异常处理机制详解

    Golang中异常处理机制详解

    这篇文章主要给大家介绍了关于Golang中异常处理机制的相关资料,其实Go语言的异常捕获要比Python中简单的多,它没有Python中那么多复杂的异常类型及继承体系,需要的朋友可以参考下
    2021-06-06
  • Go语言利用aicli实现轻松调用DeepSeek和ChatGPT

    Go语言利用aicli实现轻松调用DeepSeek和ChatGPT

    这篇文章主要为大家介绍了一款用Go语言编写的AI助手客户端库——aicli,该库不仅支持ChatGPT,还集成了DeepSeek,感兴趣的小伙伴可以了解一下
    2025-03-03
  • Go语言命令行操作命令详细介绍

    Go语言命令行操作命令详细介绍

    这篇文章主要介绍了Go语言命令行操作命令详细介绍,本文重点介绍了go build、go clean、go fmt、go get等命令,需要的朋友可以参考下
    2014-10-10
  • Go 语言入门之Go 计时器介绍

    Go 语言入门之Go 计时器介绍

    这篇文章主要介绍了Go 语言入门之Go 计时器,文章基于GO语言的相关资料展开对其中计时器的详细内容。具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 使用golang如何优雅的关机或重启操作示例

    使用golang如何优雅的关机或重启操作示例

    这篇文章主要为大家介绍了使用golang如何优雅的关机或重启操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • golang语言中wasm 环境搭建的过程详解

    golang语言中wasm 环境搭建的过程详解

    将 golang 打包为 WASM,通常有两种打包方式,一种是 golang 自带的,另外是使用 tinygo ,接下来通过本文给大家介绍golang语言中wasm 环境搭建的过程,感兴趣的朋友一起看看吧
    2021-11-11
  • go语言中的json与map相互转换实现

    go语言中的json与map相互转换实现

    本文主要介绍了go语言中的json与map相互转换实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • GoFrame代码优化gconv类型转换避免重复定义map

    GoFrame代码优化gconv类型转换避免重复定义map

    这篇文章主要为大家介绍了GoFrame代码优化gconv类型转换避免重复定义map示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Gin与Mysql实现简单Restful风格API实战示例详解

    Gin与Mysql实现简单Restful风格API实战示例详解

    这篇文章主要为大家介绍了Gin与Mysql实现简单Restful风格API示例详解,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步
    2021-11-11

最新评论