欢迎光临
我们一直在努力

PHP实现码云Gitee的WebHook密钥验证算法

PHP实现码云Gitee的WebHook密钥验证算法

码云的 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 项目

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

除特别注明外,本站所有文章均基于CC-BY-NC-SA 4.0原创,转载请注明出处。
文章名称:《PHP实现码云Gitee的WebHook密钥验证算法》
文章链接:https://www.xpn.cc/3078/fy.html
分享到: 更多 (0)

热门推荐

评论 抢沙发

登录

忘记密码 ?