码云的 WebHook 支持两种验证方式,一种是明文密码验证,另外一种是密钥验证
用户通过配置不公开的 WebHook 密钥,在请求时对请求内容签名,服务端在收到请求后以同样的密钥进行签名验证,以确认收到的请求完整且可信任。
整个过程 WebHook 密钥只存在于 Gitee 和服务端,不在网络传输中暴露。
那么 PHP 应该如何验证呢?文档只提供了 Java 和 Python2 的示例代码,我大 PHP 不配验证?
文档中说明了对应的参数:需要一个 timestamp
和 secret
,这两个参数从哪来呢?
从请求头中获取,我这里以 Swoole 的 HTTP Server 为例
$signature = $header['x-gitee-token'] ?? '';
$timestamp = $header['x-gitee-timestamp'] ?? '';
获取到所需要的参数之后来看一下具体步骤:
Step1:把
timestamp+"\n"+密钥
当做签名字符串,使用HmacSHA256
算法计算签名。 Setp2:对上述得到的结果进行Base64 encode
。 Setp3:对上述得到的结果进行urlEncode
,得到最终的签名(需要使用 UTF-8 字符集)。
官方文档一不注意就入了坑,文档需要 urlEncode
是因为要拼接到 URL 中,实际验证时是不需要的
不能想着直接反推回去验证,而且 HmacSHA256
不支持反推,我们只能自己生成验证对比进行验证
所以我们可以得到这样的代码:
$signature = $header['x-gitee-token'] ?? '';
$timestamp = $header['x-gitee-timestamp'] ?? '';
$secret = '123456'; // 所配置的密钥信息
$secret_str = "$timestamp\n$secret";
$compute_token = base64_encode(hash_hmac('sha256', $secret_str, $secret, true));
if ($signature !== $compute_token) {
echo '验证失败';
}
最后,可以直接使用我的 git-deploy 项目
任何个人或团体,未经允许禁止转载本文:《PHP 实现码云 Gitee 的 WebHook 密钥验证算法》,谢谢合作!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有