PHP转Go系列 | ThinkPHP与Gin框架之API接口签名设计实践
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"sort"
"strings"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)
type Params struct {
Key string `form:"key"`
Time int `form:"time"`
Nonce string `form:"nonce"`
}
func main() {
r := gin.Default()
r.GET("/api/get", func(c *gin.Context) {
var params Params
if err := c.ShouldBindQuery(¶ms); err != nil {
c.JSON(200, gin.H{"error": err.Error()})
return
}
if !validateSign(params, "your-secret-key") {
c.JSON(200, gin.H{"message": "Invalid sign"})
return
}
// 验证通过后的逻辑...
c.JSON(200, gin.H{"message": "Success"})
})
r.Run()
}
func validateSign(params Params, secretKey string) bool {
signData := []string{fmt.Sprintf("key=%s", params.Key),
fmt.Sprintf("nonce=%s", params.Nonce),
fmt.Sprintf("time=%d", params.Time),
secretKey,
}
sort.Strings(signData)
signStr := strings.Join(signData, "&")
sign := md5Sum(signStr)
return sign == params.Sign
}
func md5Sum(text string) string {
hash := md5.Sum([]byte(text))
return hex.EncodeToString(hash[:])
}
这段代码展示了如何在Gin框架中实现一个简单的API签名验证功能。它首先定义了一个Params结构体来接收GET请求中的参数,然后使用Gin的路由和上下文来处理请求。在请求处理函数中,它会对接收到的参数进行签名验证,如果验证通过,则处理后续的逻辑;如果验证失败,则返回错误信息。这个例子简单明了地展示了如何在Gin框架中实现API的签名验证。
评论已关闭