我正在做一个项目,我试图处理从SendGrid打开和点击事件。我在他们的instructions之后设置了一个webhook,并成功地接收了数据推送。当绕过签名验证时,我可以存储数据。
我正在使用签名的事件请求,可以看到签名和时间戳的头:
"X-Twilio-Email-Event-Webhook-Signature"
"X-Twilio-Email-Event-Webhook-Timestamp"
我正在尝试将SendGrid提供给我的公钥转换为ECDSA字符串,这样我就可以比较它并验证头中的签名。
为此,我安装了ECDSA library。当发送公钥到转换函数时,我得到以下错误:
gmp_init(): Argument #1 ($num) is not an integer string
我也试过使用SendGrid PHP library,但是,它使用相同的ECDSA库,并以相同的错误消息结束。上面写着。.
$publicKey = 'base64-encoded public key';
$eventWebhook = new EventWebhook();
$ecPublicKey = $eventWebhook->convertPublicKeyToECDSA($publicKey);
SendGrid提供的公钥按照ECDSA库的预期进行base64编码。我已经试过发送它编码,解码和之间的一切:)
转换函数然后调用ECDSA PublicKey类:
public function convertPublicKeyToECDSA($publicKey)
{
return PublicKey::fromString($publicKey);
}
publickey.php
任何帮助将不胜感激。
1条答案
按热度按时间rdrgkggo1#
谢谢你提出的一个有趣的问题,它让我进入了SendGrid的PHP帮助库的一个部分,我还没有探索过--甚至不知道。
我使用the Mezzio framework创建了a small PHP project,并提供了完整的工作解决方案。要关注的关键文件是 src/App/src/Handler/SendGridWebhookHandler。php.
但是,我所使用的功能的核心(您可以在下面看到)与您在代码示例中分享的内容非常相似。
$signature
是X-Twilio-Email-Event-Webhook-Signature
报头中的值$timestamp
是X-Twilio-Email-Event-Webhook-Timestamp
标头中的值$requestBody
是请求正文的内容$publicKey
是单击“生成验证密钥”后生成的公钥。”,如文件所示。让我知道,如果它不为你工作,或者如果你有任何问题的代码或为什么我做的事情,因为我有。