| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package services
- import (
- "context"
- "strings"
- "time"
- "github.com/mojocn/base64Captcha"
- )
- // CaptchaResponse 验证码响应结构体
- type CaptchaResponse struct {
- CaptchaID string `json:"uuid"`
- CaptchaImage string `json:"img"`
- }
- // GenerateCaptcha 生成验证码,并将结果显式存入Redis
- func GenerateCaptcha() (*CaptchaResponse, error) {
- // 初始化验证码实例(使用base64Captcha的内存存储临时存ID映射,仅用于生成,实际结果存Redis)
- driver := GetCaptchaDriver()
- memoryStore := base64Captcha.DefaultMemStore // 临时内存存储(仅生成阶段用)
- cp := base64Captcha.NewCaptcha(driver, memoryStore)
- // 生成验证码:ID、Base64图片、答案、错误
- captchaID, b64Image, answer, err := cp.Generate()
- if err != nil {
- return nil, err
- }
- // ------------------------------
- // 显式将验证码结果存入Redis(核心步骤)
- // ------------------------------
- redisKey := CaptchaRedisPrefix + captchaID
- ctx := context.Background()
- // 存入Redis并设置过期时间
- err = RedisClient.Set(ctx, redisKey, answer, CaptchaExpireMin*time.Minute).Err()
- if err != nil {
- return nil, err
- }
- return &CaptchaResponse{
- CaptchaID: redisKey,
- CaptchaImage: b64Image,
- }, nil
- }
- // VerifyCaptcha 验证验证码:从Redis读取结果对比
- func VerifyCaptcha(captchaID, userInput string) bool {
- if captchaID == "" || userInput == "" {
- return false
- }
- // ------------------------------
- // 从Redis读取验证码结果
- // ------------------------------
- ctx := context.Background()
- // 获取结果(验证后立即删除,防止重复使用)
- storedAnswer, err := RedisClient.Get(ctx, captchaID).Result()
- if err != nil { // Redis中无该键或读取失败
- return false
- }
- // 忽略大小写对比
- return strings.ToLower(storedAnswer) == strings.ToLower(userInput)
- }
|