PHP Laravel - 验证 webhook 签名
PHP Laravel - Validating webhook signature
我有一个 API 在请求中发送签名 header (X-Signature
):
header 的值是请求的 body.
的 SHA256withRSA 签名
关于 webhook 的文档有一个关于如何验证的示例:
bool Verify(string publicKey, string payload, string signature)
{
var key = (ICipherParameters)new PemReader(new StringReader(publicKey)).ReadObject();
var buffer = Encoding.UTF8.GetBytes(payload);
var signer = SignerUtilities.GetSigner("SHA256withRSA");
signer.Init(false, key);
signer.BlockUpdate(buffer, 0, buffer.Length);
return signer.VerifySignature(Convert.FromBase64String(signature));
}
我正在尝试使用 PHP/Laravel 验证 webhook。这是我的代码:
public function isValid(Request $request) : bool
{
$signature = $request->header('X-Signature');
if (! $signature) {
return false;
}
$signingSecret = ""-----BEGIN PUBLIC KEY-----\r\nMIIBIjAN......";
$computedSignature = hash_hmac('sha256', $request->getContent(), $signingSecret);
return hash_equals($signature, $computedSignature);
}
上面的 isValid()
函数 returns 在我尝试发出的每个请求上都是错误的。
这是输出 $request->all()
:
"webhookType": "test" ,
"companyId": "8628731d-ddb5-4c8f-82b1-823734962c1e" ,
"documentId": "3807f10a-9eeb-4818-a935-c8990bd50f71"
并且 X-Signature
确实在请求中:
"X-signature": "IY/QvzSDyV...."
任何人都可以帮助我解决我做错的事情吗?
我最终使用了 openssl:
public function isValid(Request $request, WebhookConfig $config): bool
{
$signature = $request->header('X-Signature');
if (! $signature) {
return false;
}
$publicKey = "...";
if (!$publicKey) {
return false;
}
$payload = $request->getContent();
$signature = base64_decode($signature);
$publicKey = openssl_pkey_get_public($publicKey);
$result = openssl_verify($payload, $signature, $publicKey, OPENSSL_ALGO_SHA256);
if ($result === 1) {
return true;
}
return false;
}
我有一个 API 在请求中发送签名 header (X-Signature
):
header 的值是请求的 body.
的 SHA256withRSA 签名关于 webhook 的文档有一个关于如何验证的示例:
bool Verify(string publicKey, string payload, string signature)
{
var key = (ICipherParameters)new PemReader(new StringReader(publicKey)).ReadObject();
var buffer = Encoding.UTF8.GetBytes(payload);
var signer = SignerUtilities.GetSigner("SHA256withRSA");
signer.Init(false, key);
signer.BlockUpdate(buffer, 0, buffer.Length);
return signer.VerifySignature(Convert.FromBase64String(signature));
}
我正在尝试使用 PHP/Laravel 验证 webhook。这是我的代码:
public function isValid(Request $request) : bool
{
$signature = $request->header('X-Signature');
if (! $signature) {
return false;
}
$signingSecret = ""-----BEGIN PUBLIC KEY-----\r\nMIIBIjAN......";
$computedSignature = hash_hmac('sha256', $request->getContent(), $signingSecret);
return hash_equals($signature, $computedSignature);
}
上面的 isValid()
函数 returns 在我尝试发出的每个请求上都是错误的。
这是输出 $request->all()
:
"webhookType": "test" ,
"companyId": "8628731d-ddb5-4c8f-82b1-823734962c1e" ,
"documentId": "3807f10a-9eeb-4818-a935-c8990bd50f71"
并且 X-Signature
确实在请求中:
"X-signature": "IY/QvzSDyV...."
任何人都可以帮助我解决我做错的事情吗?
我最终使用了 openssl:
public function isValid(Request $request, WebhookConfig $config): bool
{
$signature = $request->header('X-Signature');
if (! $signature) {
return false;
}
$publicKey = "...";
if (!$publicKey) {
return false;
}
$payload = $request->getContent();
$signature = base64_decode($signature);
$publicKey = openssl_pkey_get_public($publicKey);
$result = openssl_verify($payload, $signature, $publicKey, OPENSSL_ALGO_SHA256);
if ($result === 1) {
return true;
}
return false;
}