kra/pkg/captcha/captcha.go

97 lines
2.0 KiB
Go

package captcha
import (
"context"
"time"
"github.com/mojocn/base64Captcha"
"github.com/redis/go-redis/v9"
)
// Config 验证码配置
type Config struct {
KeyLong int
ImgWidth int
ImgHeight int
OpenCaptcha int // 0-关闭 1-开启
OpenCaptchaTimeout int // 验证码超时时间(秒)
}
// Captcha 验证码
type Captcha struct {
config Config
store base64Captcha.Store
}
// RedisStore Redis存储
type RedisStore struct {
client redis.UniversalClient
expiration time.Duration
prefix string
}
// NewRedisStore 创建Redis存储
func NewRedisStore(client redis.UniversalClient, expiration time.Duration) *RedisStore {
return &RedisStore{
client: client,
expiration: expiration,
prefix: "captcha:",
}
}
func (s *RedisStore) Set(id string, value string) error {
return s.client.Set(context.Background(), s.prefix+id, value, s.expiration).Err()
}
func (s *RedisStore) Get(id string, clear bool) string {
ctx := context.Background()
key := s.prefix + id
val, err := s.client.Get(ctx, key).Result()
if err != nil {
return ""
}
if clear {
s.client.Del(ctx, key)
}
return val
}
func (s *RedisStore) Verify(id, answer string, clear bool) bool {
v := s.Get(id, clear)
return v == answer
}
// NewCaptcha 创建验证码实例
func NewCaptcha(config Config, store base64Captcha.Store) *Captcha {
if store == nil {
store = base64Captcha.DefaultMemStore
}
return &Captcha{
config: config,
store: store,
}
}
// Generate 生成验证码
func (c *Captcha) Generate() (id, b64s, answer string, err error) {
driver := base64Captcha.NewDriverDigit(
c.config.ImgHeight,
c.config.ImgWidth,
c.config.KeyLong,
0.7,
80,
)
cp := base64Captcha.NewCaptcha(driver, c.store)
return cp.Generate()
}
// Verify 验证验证码
func (c *Captcha) Verify(id, answer string, clear bool) bool {
return c.store.Verify(id, answer, clear)
}
// IsOpen 是否开启验证码
func (c *Captcha) IsOpen() bool {
return c.config.OpenCaptcha > 0
}