ZBLOG

作为下述代码的服务端,作为服务端处理一下接口请求和aksk 的处理 package main import ( "bytes" "crypto/hmac" "crypto/sha256" "encoding/base64" "encoding/json" "fmt" "net/http" "time" ) // API请求结构体 type ApiRequest struct { Action string `json:"action"` Data string ...

下面是一个简单的服务端示例,能够处理来自客户端的请求并验证 Access Key 和 Signature。这个代码使用 Go 语言和内置的 HTTP 包来构建服务端。我们将实现一个基本的 HTTP 服务器,并定义 API 请求处理逻辑。

  1. package main
  2. import (
  3. "bytes"
  4. "crypto/hmac"
  5. "crypto/sha256"
  6. "encoding/base64"
  7. "encoding/json"
  8. "fmt"
  9. "io/ioutil"
  10. "net/http"
  11. )
  12. // API请求结构体
  13. type ApiRequest struct {
  14. Action string `json:"action"`
  15. Data string `json:"data"`
  16. }
  17. // 验证签名的函数
  18. func validateSignature(secretKey, data, signature string) bool {
  19. h := hmac.New(sha256.New, []byte(secretKey))
  20. h.Write([]byte(data))
  21. expectedSignature := base64.StdEncoding.EncodeToString(h.Sum(nil))
  22. return hmac.Equal([]byte(expectedSignature), []byte(signature))
  23. }
  24. func handler(w http.ResponseWriter, r *http.Request) {
  25. if r.Method != http.MethodPost {
  26. http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
  27. return
  28. }
  29. const secretKey = "your_secret_key"
  30. reqBody, err := ioutil.ReadAll(r.Body)
  31. if err != nil {
  32. http.Error(w, "Failed to read request body", http.StatusBadRequest)
  33. return
  34. }
  35. defer r.Body.Close()
  36. var apiRequest ApiRequest
  37. err = json.Unmarshal(reqBody, &apiRequest)
  38. if err != nil {
  39. http.Error(w, "Invalid JSON", http.StatusBadRequest)
  40. return
  41. }
  42. signature := r.Header.Get("X-Signature")
  43. if !validateSignature(secretKey, string(reqBody), signature) {
  44. http.Error(w, "Invalid signature", http.StatusUnauthorized)
  45. return
  46. }
  47. fmt.Fprintf(w, "Action: %s\nData: %s\n", apiRequest.Action, apiRequest.Data)
  48. w.WriteHeader(http.StatusOK)
  49. fmt.Fprintln(w, "Success")
  50. }
  51. func main() {
  52. http.HandleFunc("/endpoint", handler)
  53. port := ":8080" // 根据需要修改端口号
  54. fmt.Printf("Server is listening on port %s...\n", port)
  55. err := http.ListenAndServe(port, nil)
  56. if err != nil {
  57. fmt.Println("Error starting server:", err)
  58. }
  59. }

说明:

  1. API请求结构体ApiRequest 用于解析传入的 JSON 数据。
  2. 验证签名validateSignature 函数用于根据请求数据生成 HMAC 签名,并与提供的签名进行比较。
  3. 处理程序
    • 检查 HTTP 方法是否为 POST。
    • 从请求中读取 Body 并解析成 ApiRequest 类型。
    • 从请求头中获取 Signature,并调用验证函数进行验证。如果签名不匹配,返回401 Unauthorized。
  4. 主函数:设置监听器,启动 HTTP 服务器。

启动服务

在命令行中运行这个 Go 文件,服务器会在指定端口上监听来自客户端的请求。确保更改 your_secret_key 为你实际使用的密钥。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20528

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?