背景
在做机器人发消息安全校验的时候,我们把生成的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里面【飞书的做法】