http中query的坑

背景

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

签名校验方法:https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN#348211be

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里面【飞书的做法】

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容