#### 为什么base64图片 for RESTful 服务
Data URIs 支持大部分浏览器,IE8之后也支持.
小图片使用base64响应对于RESTful服务来说更便捷
CSS Image 嵌入base64图片
```css
div.image {
background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...);
}
```
HTML 嵌入base64图片`img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA..."`
#### [godoc文档](https://godoc.org/github.com/mojocn/base64Captcha)
#### 在线Demo [Playground Powered by Vuejs+elementUI+Axios](http://captcha.mojotv.cn)
[![Playground](https://raw.githubusercontent.com/mojocn/base64Captcha/master/examples/static/captcha.png "Playground")](http://captcha.mojotv.cn/ "Playground")
## 快速开始
#### 安装golang包
go get -u github.com/mojocn/base64Captcha
#### 使用golang搭建API服务
```go
package main
import (
"encoding/json"
"fmt"
"github.com/mojocn/base64Captcha"
"log"
"net/http"
"strconv"
)
// base64Captcha verify http handler
// golang 比较图像验证码 返回json
func captchaVerifyHandle(w http.ResponseWriter, r *http.Request) {
//接收客户端发送来的请求参数
r.ParseForm()
formData := r.Form
captchaId := formData.Get("captchaId")
captchaDigits := formData.Get("captchaDigits")
//比较图像验证码
verifyResult := base64Captcha.VerifyCaptcha(captchaId, captchaDigits)
//设置json响应
w.Header().Set("Content-Type", "application/json; charset=utf-8")
body := map[string]interface{}{"code": "error", "data": "验证失败", "msg": "captcha failed", "debug": formData}
if verifyResult {
body = map[string]interface{}{"code": "success", "data": "验证通过", "msg": "captcha verified", "debug": formData}
}
json.NewEncoder(w).Encode(body)
}
// base64Captcha create http handler
// 接收idKey字符串 返回base64 Data URIs 图像验证码json
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) {
//接收客户端发送来的请求参数
r.ParseForm()
formData := r.Form
//图像验证码的idKey 客户端返回.如果使用到传统web服务,idKey服务器生成设置cookie里面
captchaId := formData.Get("captchaId")
//下面的参数都是图像验证码的外观参数,可以不设置条用base64Captcha.GenerateCaptchaPngBase64StringDefault(captchaId)也可以
DotCount, _ := strconv.Atoi(formData.Get("DotCount"))
MaxSkew, _ := strconv.ParseFloat(formData.Get("MaxSkew"), 64)
PngWidth, _ := strconv.Atoi(formData.Get("PngWidth"))
PngHeight, _ := strconv.Atoi(formData.Get("PngHeight"))
DefaultLen, _ := strconv.Atoi(formData.Get("DefaultLen"))
//利用base64Captcha,创建base64图像验证码
base64Png := base64Captcha.GenerateCaptchaPngBase64String(captchaId, PngWidth, PngHeight, DotCount, DefaultLen, MaxSkew)
//你也可以是用默认参数 生成图像验证码
//base64Png := captcha.GenerateCaptchaPngBase64StringDefault(captchaId)
//设置json响应
w.Header().Set("Content-Type", "application/json; charset=utf-8")
body := map[string]interface{}{"code": 1, "data": base64Png, "msg": "success", "debug": formData}
json.NewEncoder(w).Encode(body)
}
//启动golang net/http 服务器
func main() {
//serve Vuejs+ElementUI+Axios Web Application
http.Handle("/", http.FileServer(http.Dir("./static")))
//api for create captcha
http.HandleFunc("/api/getCaptcha", generateCaptchaHandler)
//api for verify captcha
http.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle)
fmt.Println("Server is at localhost:777")
if err := http.ListenAndServe(":777", nil); err != nil {
log.Fatal(err)
}
}
```
#### base64Captcha package 主要方法
- 自定参数返回验证码base64png 返回base64 Data URIs
`func GenerateCaptchaPngBase64String(identifier string, pngWidth, pngHeight, DotCount, digitsLen int, maxSkew float64) string`
- 使用默认配置 返回base64 Data URIs,默认参数 width=240 height=70 dot-count=20 digits-len=6 skew-factor=0.7
`func GenerateCaptchaPngBase64StringDefault(identifier string) string `
- 比较返回的数字图像验证码的正确性
`func VerifyCaptcha(identifier, digits string) bool`
- 参数随机的idKey
`func RandomId() string`
- 更详细文档请查看[godoc](https://godoc.org/github.com/mojocn/base64Captcha)
#### 运行demo代码
cd $GOPATH/src/github.com/mojocn/captcha/examples
go run main.go
#### 访问 [http://localhost:777](http://localhost:777)
#### golang-demo nginx 反向代理配置 `captcha.mojotv.cn.config`
```
server {
listen 80;
server_name captcha.mojotv.cn;
charset utf-8;
location / {
try_files /_not_exists_ @backend;
}
location @backend {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:777;
}
access_log /home/wwwlogs/captcha.mojotv.cn.log;
}
```
[如果觉得这教程有用请访问GitHub 提Issue Star Fork](https://github.com/mojocn/base64Captcha/wiki/%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/_edit)
## [base64Captcha](https://github.com/mojocn/base64captcha)功能增加,上文已失效.新版说明请看下文.
#### 为什么base64图片 for RESTful 服务
Data URIs 支持大部分浏览器,IE8之后也支持.
小图片使用base64响应对于RESTful服务来说更便捷
#### [godoc文档](https://godoc.org/github.com/mojocn/base64Captcha)
#### 在线Demo [Playground Powered by Vuejs+elementUI+Axios](http://captcha.mojotv.cn)
[![Playground](https://raw.githubusercontent.com/mojocn/base64Captcha/master/examples/static/captcha.png "Playground")](http://captcha.mojotv.cn/ "Playground")
[![28+58=?.png](https://raw.githubusercontent.com/mojocn/base64Captcha/master/examples/static/28%2B58%3D%3F.png)](http://captcha.mojotv.cn/ "Playground")
[![ACNRfd.png](https://raw.githubusercontent.com/mojocn/base64Captcha/master/examples/static/ACNRfd.png)](http://captcha.mojotv.cn/ "Playground")
[![rW4npZ.png](https://raw.githubusercontent.com/mojocn/base64Captcha/master/examples/static/rW4npZ.png)](http://captcha.mojotv.cn/ "Playground")
[![99+73=?.png](https://raw.githubusercontent.com/mojocn/base64Captcha/master/examples/static/99%2B73%3D%3F.png)](http://captcha.mojotv.cn/ "Playground")
[![ctOv6N.png](https://raw.githubusercontent.com/mojocn/base64Captcha/master/examples/static/ctOv6N.png)](http://captcha.mojotv.cn/ "Playground")
[![gGncJC.png](https://raw.githubusercontent.com/mojocn/base64Captcha/master/examples/static/gGncJC.png)](http://captcha.mojotv.cn/ "Playground")
[![108360.png](https://raw.githubusercontent.com/mojocn/base64Captcha/master/examples/static/108360.png)](http://captcha.mojotv.cn/ "Playground")
[wav file](https://raw.githubusercontent.com/mojocn/base64Captcha/master/examples/static/1lNMVxfysfSQJXvjR1LX.wav)
### 安装golang包
go get -u github.com/mojocn/base64Captcha
### 创建图像验证码
```
import "github.com/mojocn/base64Captcha"
func demoCodeCaptchaCreate() {
//config struct for digits
//数字验证码配置
var configD = base64Captcha.ConfigDigit{
Height: 80,
Width: 240,
MaxSkew: 0.7,
DotCount: 80,
CaptchaLen: 5,
}
//config struct for audio
//声音验证码配置
var configA = base64Captcha.ConfigAudio{
CaptchaLen: 6,
Language: "zh",
}
//config struct for Character
//字符,公式,验证码配置
var configC = base64Captcha.ConfigCharacter{
Height: 60,
Width: 240,
//const CaptchaModeNumber:数字,CaptchaModeAlphabet:字母,CaptchaModeArithmetic:算术,CaptchaModeNumberAlphabet:数字字母混合.
Mode: base64Captcha.CaptchaModeNumber,
ComplexOfNoiseText: base64Captcha.CaptchaComplexLower,
ComplexOfNoiseDot: base64Captcha.CaptchaComplexLower,
IsShowHollowLine: false,
IsShowNoiseDot: false,
IsShowNoiseText: false,
IsShowSlimeLine: false,
IsShowSineLine: false,
CaptchaLen: 6,
}
//创建声音验证码
//GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
idKeyA, capA := base64Captcha.GenerateCaptcha("", configA)
//以base64编码
base64stringA := base64Captcha.CaptchaWriteToBase64Encoding(capA)
//创建字符公式验证码.
//GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
idKeyC, capC := base64Captcha.GenerateCaptcha("", configC)
//以base64编码
base64stringC := base64Captcha.CaptchaWriteToBase64Encoding(capC)
//创建数字验证码.
//GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
idKeyD, capD := base64Captcha.GenerateCaptcha("", configD)
//以base64编码
base64stringD := base64Captcha.CaptchaWriteToBase64Encoding(capD)
fmt.Println(idKeyA, base64stringA, "\n")
fmt.Println(idKeyC, base64stringC, "\n")
fmt.Println(idKeyD, base64stringD, "\n")
}
```
### 验证图像验证码
```
import "github.com/mojocn/base64Captcha"
func verfiyCaptcha(idkey,verifyValue string){
verifyResult := base64Captcha.VerifyCaptcha(idkey, verifyValue)
if verifyResult {
//success
} else {
//fail
}
}
```
#### 使用golang搭建API服务
```go
// example of HTTP server that uses the captcha package.
package main
import (
"encoding/json"
"fmt"
"github.com/mojocn/base64Captcha"
"log"
"net/http"
)
//ConfigJsonBody json request body.
type ConfigJsonBody struct {
Id string
CaptchaType string
VerifyValue string
ConfigAudio base64Captcha.ConfigAudio
ConfigCharacter base64Captcha.ConfigCharacter
ConfigDigit base64Captcha.ConfigDigit
}
// base64Captcha create http handler
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) {
//parse request parameters
//接收客户端发送来的请求参数
decoder := json.NewDecoder(r.Body)
var postParameters ConfigJsonBody
err := decoder.Decode(&postParameters)
if err != nil {
log.Println(err)
}
defer r.Body.Close()
//create base64 encoding captcha
//创建base64图像验证码
var config interface{}
switch postParameters.CaptchaType {
case "audio":
config = postParameters.ConfigAudio
case "character":
config = postParameters.ConfigCharacter
default:
config = postParameters.ConfigDigit
}
//GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
captchaId, digitCap := base64Captcha.GenerateCaptcha(postParameters.Id, config)
base64Png := base64Captcha.CaptchaWriteToBase64Encoding(digitCap)
//or you can do this
//你也可以是用默认参数 生成图像验证码
//base64Png := captcha.GenerateCaptchaPngBase64StringDefault(captchaId)
//set json response
//设置json响应
w.Header().Set("Content-Type", "application/json; charset=utf-8")
body := map[string]interface{}{"code": 1, "data": base64Png, "captchaId": captchaId, "msg": "success"}
json.NewEncoder(w).Encode(body)
}
// base64Captcha verify http handler
func captchaVerifyHandle(w http.ResponseWriter, r *http.Request) {
//parse request parameters
//接收客户端发送来的请求参数
decoder := json.NewDecoder(r.Body)
var postParameters ConfigJsonBody
err := decoder.Decode(&postParameters)
if err != nil {
log.Println(err)
}
defer r.Body.Close()
//verify the captcha
//比较图像验证码
verifyResult := base64Captcha.VerifyCaptcha(postParameters.Id, postParameters.VerifyValue)
//set json response
//设置json响应
w.Header().Set("Content-Type", "application/json; charset=utf-8")
body := map[string]interface{}{"code": "error", "data": "验证失败", "msg": "captcha failed"}
if verifyResult {
body = map[string]interface{}{"code": "success", "data": "验证通过", "msg": "captcha verified"}
}
json.NewEncoder(w).Encode(body)
}
//start a net/http server
//启动golang net/http 服务器
func main() {
//serve Vuejs+ElementUI+Axios Web Application
http.Handle("/", http.FileServer(http.Dir("./static")))
//api for create captcha
//创建图像验证码api
http.HandleFunc("/api/getCaptcha", generateCaptchaHandler)
//api for verify captcha
http.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle)
fmt.Println("Server is at localhost:3333")
if err := http.ListenAndServe("localhost:3333", nil); err != nil {
log.Fatal(err)
}
}
```
#### 运行demo代码
cd $GOPATH/src/github.com/mojocn/captcha/examples
go run main.go
#### 访问 `http://localhost:777`
#1