下面是一个简单的服务端示例,能够处理来自客户端的请求并验证 Access Key 和 Signature。这个代码使用 Go 语言和内置的 HTTP 包来构建服务端。我们将实现一个基本的 HTTP 服务器,并定义 API 请求处理逻辑。
package main
import (
"bytes"
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
// API请求结构体
type ApiRequest struct {
Action string `json:"action"`
Data string `json:"data"`
}
// 验证签名的函数
func validateSignature(secretKey, data, signature string) bool {
h := hmac.New(sha256.New, []byte(secretKey))
h.Write([]byte(data))
expectedSignature := base64.StdEncoding.EncodeToString(h.Sum(nil))
return hmac.Equal([]byte(expectedSignature), []byte(signature))
}
func handler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
const secretKey = "your_secret_key"
reqBody, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, "Failed to read request body", http.StatusBadRequest)
return
}
defer r.Body.Close()
var apiRequest ApiRequest
err = json.Unmarshal(reqBody, &apiRequest)
if err != nil {
http.Error(w, "Invalid JSON", http.StatusBadRequest)
return
}
signature := r.Header.Get("X-Signature")
if !validateSignature(secretKey, string(reqBody), signature) {
http.Error(w, "Invalid signature", http.StatusUnauthorized)
return
}
fmt.Fprintf(w, "Action: %s\nData: %s\n", apiRequest.Action, apiRequest.Data)
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, "Success")
}
func main() {
http.HandleFunc("/endpoint", handler)
port := ":8080" // 根据需要修改端口号
fmt.Printf("Server is listening on port %s...\n", port)
err := http.ListenAndServe(port, nil)
if err != nil {
fmt.Println("Error starting server:", err)
}
}
说明:
- API请求结构体:
ApiRequest
用于解析传入的 JSON 数据。 - 验证签名:
validateSignature
函数用于根据请求数据生成 HMAC 签名,并与提供的签名进行比较。 - 处理程序:
- 检查 HTTP 方法是否为 POST。
- 从请求中读取 Body 并解析成
ApiRequest
类型。 - 从请求头中获取 Signature,并调用验证函数进行验证。如果签名不匹配,返回401 Unauthorized。
- 主函数:设置监听器,启动 HTTP 服务器。
启动服务
在命令行中运行这个 Go 文件,服务器会在指定端口上监听来自客户端的请求。确保更改 your_secret_key
为你实际使用的密钥。
内容由零声教学AI助手提供,问题来源于学员提问