signature
feishu.signature
¶
SignatureVerifier
¶
可复用的飞书 Webhook 签名校验器,支持可选的重放时间窗保护。
校验飞书事件/卡片回调请求的 X-Lark-Signature 签名,并可依据
X-Lark-Request-Timestamp 拒绝过期请求以防重放。空的密钥会使 HMAC 退化为
可伪造的固定哈希,因此构造时禁止传入空 encrypt_key。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
str
|
应用配置的飞书 |
必需 |
|
float | None
|
允许的请求最大时延(秒),默认 300;设为 |
300
|
|
Callable[[], float]
|
返回当前 epoch 时间(浮点秒)的可调用对象,默认 time.time; 可注入 lambda 以编写确定性测试。 |
time
|
引发:
| 类型 | 描述 |
|---|---|
ValueError
|
当 |
飞书文档
示例:
源代码位于: feishu/signature.py
| Python | |
|---|---|
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | |
is_valid
¶
is_valid(*, timestamp: str | None, nonce: str | None, body: bytes, signature: str | None) -> bool
校验签名是否有效且请求未过期。
任一字段缺失或为空字符串都会立即拒绝(部分网关会把缺失的请求头规整为空串);
启用重放时间窗时,时间戳无法解析或超出 max_age_seconds 也会拒绝;最后委托
共享的加密函数完成 MAC 校验。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
str | None
|
请求头 |
必需 |
|
str | None
|
请求头 |
必需 |
|
bytes
|
原始请求体字节。 |
必需 |
|
str | None
|
请求头 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
bool
|
签名有效且请求未过期返回 |
示例:
源代码位于: feishu/signature.py
is_valid_request
¶
校验由请求体与请求头构成的完整签名请求是否有效。
从请求头中提取 X-Lark-Signature、X-Lark-Request-Timestamp、
X-Lark-Request-Nonce 后委托 feishu.signature.SignatureVerifier.is_valid
校验。请求头名称按小写比较,故大小写不敏感。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
bytes
|
原始请求体字节。 |
必需 |
|
Mapping[str, str]
|
任意 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
bool
|
请求签名有效且未过期返回 |
示例:
源代码位于: feishu/signature.py
verify_signature
¶
verify_signature(timestamp: str, nonce: str, encrypt_key: str, raw_body: bytes, signature: str) -> bool
校验飞书事件推送的签名。
飞书在请求头中携带 X-Lark-Request-Timestamp、X-Lark-Request-Nonce 与 X-Lark-Signature。
签名为 sha256(timestamp + nonce + encrypt_key + raw_body) 的十六进制摘要。
本函数使用常量时间比较以避免计时攻击。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
str
|
请求头 |
必需 |
|
str
|
请求头 |
必需 |
|
str
|
应用配置的 Encrypt Key。 |
必需 |
|
bytes
|
HTTP 请求的原始字节体(必须在解析 JSON 之前读取,不能被改动)。 |
必需 |
|
str
|
请求头 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
bool
|
签名匹配返回 |
飞书文档
示例: