Gitee PHP WebHook sign 签名密钥方式验签代码 亲测有效 包通过

官方总是喜欢留一个小坑,提供了python示例代码,也提供了java示例,就是没有提供php代码,折腾了许久,真的要抓狂了!


$headers = getallheaders();
$gitee_token = $headers["X-Gitee-Token"];
$gitee_timestamp =$headers["X-Gitee-Timestamp"];
echo "gitee_token: $gitee_token
\n";
echo "gitee_timestamp: $gitee_timestamp
\n";
$sign_key = "yuema";
$sec_str = "$gitee_timestamp\n$sign_key";
$compute_token = base64_encode(hash_hmac('sha256', $sec_str,$sign_key,true));

echo "computetoken: $compute_token
\n";

if($compute_token==$gitee_token){
echo "授权验证通过\n";
}

echo "welcome to yue.ma! ";
//git cmd here

亲测,有效!

这种验签的方式,是否有些熟悉?好多平台之间的签名都有种说不出来的默契,是的!找Gitee相关的签名,找到的都是token,感觉没有验签安全,于是,执着的找为什么?
官方文档坑人之处

如果 WebHook 使用了签名方式,在请求目标时会在当次请求头中加入名为 X-Gitee-Token,值为生成的签名内容。其签名实现算法如下:

签名参数说明
参数 说明
timestamp 当前时间戳,单位是毫秒,与请求调用时间误差不能超过1小时,请求时需和密钥一并发送
secret 签名密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串
Step1:把timestamp+”\n”+密钥当做签名字符串,使用HmacSHA256算法计算签名。
Setp2:对上述得到的结果进行 Base64 encode。
Setp3:对上述得到的结果进行 urlEncode,得到最终的签名(需要使用UTF-8字符集)。
第二步,把 timestamp和第一步得到的签名值拼接到URL中。
写的是生成算法,urlEncode在验签的过程中是不需要的。话说,小白们都等着验签,官方却丢一个,你看,我们是这么生成的,验签你们自己看着办。有点拽。