首頁 > 後端開發 > Golang > 主體

使用Gin框架實現驗證碼產生和驗證功能

PHPz
發布: 2023-06-22 12:01:37
原創
1456 人瀏覽過

隨著網路的發展,驗證碼越來越成為了網站和應用程式的常見安全驗證措施。驗證碼是一種基於圖像、聲音、文字等形式的人機互動技術,目的是防止機器人惡意攻擊和濫用。

在這篇文章中,我們將介紹如何使用Go語言的Gin框架實作驗證碼產生和驗證功能。 Gin是一個輕量級的網路框架,可以快速建立RESTful API和WEB應用程式。

  1. 安裝Gin框架

在開始之前,我們需要先安裝Gin框架。可以使用Go命令列工具進行安裝:

go get -u github.com/gin-gonic/gin
登入後複製
  1. 實作驗證碼產生功能

為了產生驗證碼圖片,我們需要使用第三方函式庫github.com/mojocn /base64Captcha。該庫提供了多種驗證碼類型,並支援自訂參數。以下是一個產生影像驗證碼的範例程式碼:

package main

import (
    "fmt"
    "time"

    "github.com/gin-gonic/gin"
    "github.com/mojocn/base64Captcha"
)

func main() {
    r := gin.Default()

    // 生成验证码图片
    r.GET("/captcha", func(c *gin.Context) {
        // 配置
        driver := base64Captcha.NewDriverDigit(80, 240, 4, 0.5, 80)
        store := base64Captcha.DefaultMemStore
        captcha := base64Captcha.NewCaptcha(driver, store)

        // 生成验证码
        id, b64s, err := captcha.Generate()
        if err != nil {
            c.JSON(500, gin.H{"error": err.Error()})
            return
        }

        // 返回验证码图片
        c.JSON(200, gin.H{
            "id":      id,
            "image":   b64s,
            "expires": time.Now().Add(time.Minute * 5).Unix(),
        })
    })

    r.Run(":8080")
}
登入後複製

在這個範例中,我們使用了預設Memeory儲存來儲存驗證碼資訊(也可以使用Redis等其他儲存)。基於數字的驗證碼驅動程式使用80個像素的寬度,240個像素的高度,四個字元長度和0.5的雜訊強度建立驗證碼。 Generate方法會將產生的驗證碼ID、驗證碼圖片和錯誤訊息傳回。在這裡,我們將驗證碼圖片以base64編碼的形式傳回給客戶端,並在回應中指定了過期時間。

  1. 實作驗證碼驗證功能

在用戶端提交驗證碼時,需要驗證使用者輸入是否與產生的驗證碼相符。還是使用github.com/mojocn/base64Captcha函式庫提供的Verify函數驗證驗證碼。下面是一個驗證影像驗證碼的範例程式碼:

package main

import (
    "fmt"

    "github.com/gin-gonic/gin"
    "github.com/mojocn/base64Captcha"
)

func main() {
    r := gin.Default()

    // 验证验证码
    r.POST("/verify", func(c *gin.Context) {
        var form struct {
            ID   string `form:"id" binding:"required"`
            Code string `form:"code" binding:"required"`
        }
        if err := c.ShouldBind(&form); err != nil {
            c.JSON(400, gin.H{"error": err.Error()})
            return
        }

        // 验证验证码
        if base64Captcha.VerifyCaptcha(form.ID, form.Code) {
            c.JSON(200, gin.H{"success": true})
        } else {
            c.JSON(401, gin.H{"error": "验证码错误"})
        }
    })

    r.Run(":8080")
}
登入後複製

在這個範例中,我們定義了一個結構體來儲存從客戶端提交的驗證碼ID和驗證碼值。使用ShouldBind函數將請求體綁定到結構體中。如果綁定失敗,則傳回400錯誤。在驗證驗證碼時,可以使用VerifyCaptcha函數驗證客戶端提交的驗證碼值是否正確。如果驗證成功,回傳200回應;否則,回傳401錯誤並提示驗證碼錯誤的原因。

  1. 完整程式碼

將上面的產生驗證碼和驗證驗證碼的範例程式碼組合起來,我們就可以得到一個完整的程式碼,如下所示:

package main

import (
    "fmt"
    "time"

    "github.com/gin-gonic/gin"
    "github.com/mojocn/base64Captcha"
)

func main() {
    r := gin.Default()

    // 生成验证码图片
    r.GET("/captcha", func(c *gin.Context) {
        // 配置
        driver := base64Captcha.NewDriverDigit(80, 240, 4, 0.5, 80)
        store := base64Captcha.DefaultMemStore
        captcha := base64Captcha.NewCaptcha(driver, store)

        // 生成验证码
        id, b64s, err := captcha.Generate()
        if err != nil {
            c.JSON(500, gin.H{"error": err.Error()})
            return
        }

        // 返回验证码图片
        c.JSON(200, gin.H{
            "id":      id,
            "image":   b64s,
            "expires": time.Now().Add(time.Minute * 5).Unix(),
        })
    })

    // 验证验证码
    r.POST("/verify", func(c *gin.Context) {
        var form struct {
            ID   string `form:"id" binding:"required"`
            Code string `form:"code" binding:"required"`
        }
        if err := c.ShouldBind(&form); err != nil {
            c.JSON(400, gin.H{"error": err.Error()})
            return
        }

        // 验证验证码
        if base64Captcha.VerifyCaptcha(form.ID, form.Code) {
            c.JSON(200, gin.H{"success": true})
        } else {
            c.JSON(401, gin.H{"error": "验证码错误"})
        }
    })

    r.Run(":8080")
}
登入後複製
  1. 總結

本文介紹如何使用Gin框架和github.com/mojocn/base64Captcha函式庫實作驗證碼產生和驗證功能。驗證碼技術是目前廣泛應用的安全驗證手段,可以有效地防止機器人攻擊和惡意濫用。在實踐中,還可以根據實際需求選擇其他驗證碼類型和儲存方式,並結合其他安全措施來加強應用程式的安全性和可靠性。

以上是使用Gin框架實現驗證碼產生和驗證功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!