n8n 对接飞书 Webhook:签名校验与 Crypto 节点实战
在自动化运维或消息通知场景中,将 n8n 工作流与飞书自定义机器人结合非常高效。但飞书对安全校验有严格要求,尤其是签名验证(Signature Verification),很多开发者在这里容易踩坑。本文基于实际工程经验,梳理从机器人配置到 n8n 端签名计算的完整流程。
一、飞书自定义机器人配置
自定义机器人只能在特定群聊中使用,无需租户管理员审核,适合快速集成。
- 添加机器人:进入目标群组,点击右上角更多按钮,选择设置 > 群机器人 > 添加机器人 > 自定义机器人。设置头像、名称后完成创建。
- 获取 Webhook:复制生成的 webhook 地址,格式通常为
https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx。请妥善保管,避免公开泄露。 - 测试连接:使用 curl 或 Postman 发送 POST 请求测试连通性。
curl -X POST -H "Content-Type: application/json" \
-d '{"msg_type":"text","content":{"text":"request example"}}' \
https://open.feishu.cn/open-apis/bot/v2/hook/your_webhook_id
成功返回 code: 0 即表示可用。注意请求体大小不能超过 20KB。
二、安全设置与签名校验
为了防恶意调用,建议开启签名校验。这是 n8n 对接中最关键的一步。
1. 开启签名校验
在机器人配置页面,找到安全设置,选择签名校验并复制密钥(Secret)。
2. 签名算法逻辑
飞书的签名计算方式比较特殊,与标准 HMAC 用法略有不同:
- 签名字符串:
timestamp + "\n" + secret - 算法:HmacSHA256
- 输入数据:空字符串
- 输出编码:Base64
注意:这里 key 参数是拼接后的字符串,而 msg 参数为空。很多示例代码直接传 secret 作为 key,会导致校验失败。
3. 常见语言实现参考
如果你需要手动验证,可以参考以下逻辑:
Python 示例
import hashlib, hmac, base64
def gen_sign(timestamp, secret):
string_to_sign = '{}\n{}'.format(timestamp, secret)
hmac_code = hmac.new(string_to_sign.encode("utf-8"), digestmod=hashlib.sha256).digest()
return base64.b64encode(hmac_code).decode('utf-8')
Java 示例
import javax.crypto.Mac;
javax.crypto.spec.SecretKeySpec;
java.nio.charset.StandardCharsets;
org.apache.commons.codec.binary.Base64;
{
String Exception {
timestamp + + secret;
Mac.getInstance();
mac.init( (stringToSign.getBytes(StandardCharsets.UTF_8), ));
[] signData = mac.doFinal( []{});
(Base64.encodeBase64(signData));
}
}


