http中query的坑

188 阅读1分钟

背景

在做机器人发消息安全校验的时候,我们把生成的sign放到query里面进行传递,会经常性的出现签名错误

签名校验方法:open.feishu.cn/document/uk…

func GenSign(secret string, timestamp int64) (string, error) {
   //timestamp + key 做sha256, 再进行base64 encode
   stringToSign := fmt.Sprintf("%v", timestamp) + "\n" + secret

   var data []byte
   h := hmac.New(sha256.New, []byte(stringToSign))
   _, err := h.Write(data)
   if err != nil {
      return "", err
   }

   signature := base64.StdEncoding.EncodeToString(h.Sum(nil))
   return signature, nil
}

原因

业务组的基础网关会对收到的http请求中的query做urldecode操作,生成的签名中有加号,decode以后就变为空格了

func TestQuery(t *testing.T) {
	s := "++xzxx++"
	fmt.Println(s)
	escape := url.QueryEscape(s)
	fmt.Println("escape", escape)
	unescape, _ := url.QueryUnescape(s)
	fmt.Println("unescape", unescape)
}

=== RUN   TestQuery
++xzxx++
escape %2B%2Bxzxx%2B%2B
unescape   xzxx  
--- PASS: TestQuery (0.00s)
PASS

解决方案

1.生成签名以后,对签名做一次urlencode再放到query里面 2.签名不要放到query里面,放到body里面【飞书的做法】http中query的坑