用于Opsani伺服组件的柔性webhook连接器
servo-webhooks的Python项目详细描述
伺服网络挂钩
提供灵活的webhook的OpsaniServo连接器 基于servo events的发射器。在
webhooks连接器扩展了伺服提供的事件基础结构,以启用事件 通过HTTP或HTTP/2请求回调进行调度。请求在 尽最大努力。webhook可以注册为在中定义的任何事件之前执行,或者在之后执行 伺服总成。在事件发生之前,应该小心使用webhook,因为它们可能会阻止 事件挂起webhook的传递或通过响应完全取消事件(见下文)。 支持webhook请求的可配置自动重试和超时。在
Webhook请求通过HTTPPOST
方法和JSON请求体发送。webhook请求主体
根据向伺服注册的事件的参数和返回值动态定义。
此机制将webhook连接器通用化,以支持任何连接器定义的任意事件
在伺服总成内。{JSON>可以获取头文件
通过webhooks
CLI子命令(参见下面的用法)。在
配置
webhooks:-name:my_measure_handler# Optional. Name of the webhook. description:Store measurement info into Elastic Search.# Optional: Textual description of the webhookevents:-after:measure# Required. Format: `(before|after):[EVENT_NAME]`url:https://example.com/webhooks# Required. Format: [URL]secret:s3cr3t# Required. Secret value for computing webhook signaturesheaders:# Optional, Dict[str, str]-name:x-some-headervalue:some valuebackoff:# Optional. Setting to `false` disables retries.max_tries:3max_time:5m
起始点配置可以通过:servo generate --defaults webhooks
添加到伺服组件。在
Webhook请求示例
TODO:为几个事件插入头和请求正文
^{pr2}$为了方便起见,servo webhook包含在默认servox程序集Docker images中。在
使用
- 正在列出webhook:
servo webhooks list
- 正在获取事件内容类型和负载架构:
servo webhooks schema after:measure
- 触发特别网络挂钩:
servo webhooks trigger after:adjust ([NAME|URL])
实现Webhook响应程序
TODO:内容类型等标题。包括连接器版本、其他事件元数据。架构版本控制。在
验证Webhook签名
所有的webhook请求都用X-Servo-Signature
头发送。此标头的值是十六进制
HMACSHA1摘要的字符串表示形式,使用
webhook配置中的secret
键。签名可以很容易地验证以验证
webhook负载的真实性和完整性。所有主要平台都支持HMAC计算
在大多数现代编程语言的标准库中。在
从Python中的webhook请求计算HMAC SHA1摘要的示例如下:
secret="super secret authentication code"expected_signature=request.headers["x-servo-signature"]body=request.read()signature=str(hmac.new(secret.encode(),body,hashlib.sha1).hexdigest())assertsignature==expected_signature
通过Webhook取消活动
假设您想要实现一个webhook,它实现基于条件的调整授权
比如只允许他们在午夜和凌晨3点。为了实现这一点,webhook响应程序将
返回一个200(OK)状态代码和一个对servo.errors.CancelEventError
对象建模的响应体。servo-webhooks
连接器将反序列化CancelEventError
表示,并在
程序集,取消事件。要指示响应体是CancelEventError
错误的表示,
将Content-Type
头设置为application/vnd.opsani.servo.errors.CancelEventError+json
,并返回一个JSON对象
其中包含一个描述事件取消原因的reason
属性:
TODO:取消的最佳状态代码/响应是什么?
返回一个200(OK)响应,其中Content-Type
为:
> POST http://webhooks.example.com/servo-webhooks
> Content-Type: application/vnd.opsani.servo.events.Event+json # TODO: Not the right content type
> {
> ...
> }
< 200 (OK)
< Content-Type: application/vnd.opsani.servo.errors.CancelEventError+json
< {
< "reason": "Unable to authorize adjustment: Adjustments are only permitted between midnight and 3am."
< }
配置退避重试和超时
TODO:禁用回退以避免在before处理程序上阻塞。在
技术细节
Webhook请求在内存中以非持久方式进行管理。请求通过异步httpx发出 客户端建立在asyncio之上。对webhook请求主体JSON模式的支持通过 servox中Pydantic的深度集成。支持的退避和重试通过 backoff库。在
测试
自动化测试通过Pytest:pytest test_servo_webhooks.py
实现
许可证
ServoWebhooks是根据Apache2.0开源条款发布的许可证。在
许可证的副本在存储库根目录下的LICENSE文件中提供。在
- 项目
标签: