通过签名验证 Shipwire Webhook

Verifying Shipwire Webhook via Signature

我似乎无法验证 shipwire 的签名。我已经检查过,来自论坛等的大多数示例似乎都有效,但它不适用于 shipwire,我想知道是否有人有处理 shipwire 的经验。基本上代码状态

X-Shipwire-Signature: abc123;secret-id=2
The hash value is the HMAC-SHA256 of the unaltered POST request body

所以对我的代码进行了简单检查,我首先通过他们的 api 注册了一个秘密并获得了结果,并将其存储在 rails 凭据中

"resource":{"id":796,"secret":"cbfbf1dc131cd590ed04f5d2c80651f...",

所以在我的控制器中我做了以下操作

webhook_secret = Rails.application.credentials.shipwire[:webhook_secret]
data = request.raw_post
result = OpenSSL::HMAC.hexdigest("sha256", webhook_secret, data)

但结果与他们返回的签名不匹配,相差不大。

好吧,我终于解决了这个问题,对于那些在 shipwire 上工作的人来说,因为这方面的文档不多,我会 post。

基本上你需要将注册的秘密转换为二进制并将其用作哈希匹配的密钥,我没有时间正确编写代码但我能够通过快速脏代码进行验证

shipwire_sig = request.headers["HTTP_X_SHIPWIRE_SIGNATURE"]
key = webhook_secret.scan(/../).map { |x| x.hex.chr }.join
signature = OpenSSL::HMAC.hexdigest("sha256", key, data)
shipwire_sig == signature