【问题标题】:Rails: Cannot match webhook signature in json responseRails:无法匹配 json 响应中的 webhook 签名
【发布时间】:2021-10-10 10:06:46
【问题描述】:

我需要能够验证 webhook 的签名,但我似乎无法正确匹配该值。我使用的工具提供了预期的签名作为请求的 URL 参数:

YOUR_CALLBACK_URL?signature=ofdiwefjojiefwojowefoi
# www.websitename.com?signature=ofdiwefjojiefwojowefoi

他们声明他们生成签名的方式是:

使用此 Webhook 机密,使用 Webhook 帖子的原始 HTTP 正文的 HMAC-SHA-256 base64 摘要生成签名。

你可以在php中生成签名如下:

$request_body = file_get_contents('php://input');
$s = hash_hmac('sha256', $request_body, 'mySecret', true);
echo base64_encode($s);

在我的应用中,我尝试通过执行以下操作来生成匹配的签名:

key = ENV['ESIGNGENIE_SECRET']
data = params.to_json
signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, data)).strip()
return signature == params["signature"]

这似乎总是错误的。我在这里做错了吗?我不知道我是否因为 Rails 解析 json 对象的方式或其他原因而遇到问题。

【问题讨论】:

  • 您是否尝试将两个签名打印出来进行比较,看看 rails 是如何解析它的?
  • 是的,我有,但它们不同。
  • 更奇怪的是,我最初使用 Hookbin 来捕获 webhook,当我使用 hookbin 中显示的主体并将其转换为字符串并执行完全相同的摘要时,我得到了正确的签名。我不明白区别

标签: ruby-on-rails json webhooks


【解决方案1】:

在做了一些研究之后,我意识到我的错误是尝试使用 params 来生成签名,而我应该使用 request.body.read。它应该如下所示:

key = ENV['ESIGNGENIE_SECRET']
data = request.body.read
signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, data)).strip()
return signature == params["signature"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多