使用带有秘密的 curl 模拟 github hook

ℝap*_*ink 1 curl openssl github hmac webhooks

我有一个类似于Emulate github service hooks wih curl 的需求,但我也在我的 webhook 中使用了一个秘密,但它无法正常工作。

这是我作为接收后挂钩所做的:

#!/bin/bash

while read oldrev newrev refname; do
  tmpfile=$(mktemp --suffix=.json)

  cat << EOF > $tmpfile
  {
    "ref": "${refname}"
  }
EOF

  sig=$(cat "${tmpfile}" | openssl dgst -sha1 -hmac "${WEBHOOK_SECRET}" | awk '{print "X-Hub-Signature: sha1="$2}')

  curl -X POST -H "Content-Type: application/json" -H "${sig}" --data-urlencode "payload@${tmpfile}" http://webhook:9000/hooks/r10k

  rm -f "${tmpfile}"
done
Run Code Online (Sandbox Code Playgroud)

webhook(与 github 一起使用)抱怨签名错误。

我究竟做错了什么?

ℝap*_*ink 5

问题来自 openssl 命令中输入流末尾的回车符。

我改为这样:

#!/bin/bash

while read oldrev newrev refname; do
  tmpfile=$(mktemp --suffix=.json)

  data="{\"ref\": \"${refname}\"}"

  sig=$(echo -n "${data}" | openssl dgst -sha1 -hmac "%{WEBHOOK_SECRET}" | awk '{print "X-Hub-Signature: sha1="$2}')

  curl -X POST -H "Content-Type: application/json" -H "${sig}" --data "${data}" http://webhook:9000/hooks/r10k

  rm -f "${tmpfile}"
done
Run Code Online (Sandbox Code Playgroud)

它奏效了。