63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
//go:build example
|
||
// +build example
|
||
|
||
package main
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"log"
|
||
|
||
"git.toowon.com/jimmy/go-common/captcha"
|
||
"git.toowon.com/jimmy/go-common/config"
|
||
"git.toowon.com/jimmy/go-common/factory"
|
||
)
|
||
|
||
func main() {
|
||
cfg, err := config.LoadFromFile("./config/example.json")
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
|
||
app := factory.New(cfg)
|
||
cap, err := app.Captcha()
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
|
||
if !cap.Enabled() {
|
||
fmt.Println("captcha disabled — set captcha.enabled=true and configure redis to enable")
|
||
return
|
||
}
|
||
|
||
ctx := context.Background()
|
||
|
||
// 1. 注册场景:生成图形验证码
|
||
result, err := cap.Generate(ctx, captcha.SceneRegister)
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
fmt.Printf("captcha id: %s\n", result.ID)
|
||
fmt.Printf("captcha image length: %d (base64)\n", len(result.ImageBase64))
|
||
|
||
// 2. 发短信前校验(业务侧在 handler 中调用;此处演示 API)
|
||
// 实际使用时 answer 来自用户输入
|
||
_ = cap.Verify(ctx, captcha.VerifyRequest{
|
||
Scene: captcha.SceneRegister,
|
||
ID: result.ID,
|
||
Answer: "user-input",
|
||
})
|
||
|
||
// 3. 登录防暴力
|
||
key := "user@example.com"
|
||
status, _ := cap.RecordLoginFailure(ctx, key)
|
||
fmt.Printf("login failures: %d, needCaptcha: %v, locked: %v\n",
|
||
status.FailCount, status.NeedCaptcha, status.Locked)
|
||
|
||
need, _ := cap.LoginNeedCaptcha(ctx, key)
|
||
fmt.Printf("login need captcha: %v\n", need)
|
||
|
||
// 登录成功后清除
|
||
_ = cap.ClearLoginFailures(ctx, key)
|
||
}
|