我正在尝试在 php 中实现一个身份验证中间件,用于 azures 语音到文本 api 的 webhook 回调。
我想为此使用 X-MicrosoftSpeechServices-Signature 标头。文档指出,这是有效载荷的 sha256 加密值,其密钥为密钥。
假设 webhook 发回如下请求:
{
"self":"https:\/\/southcentralus.api.cognitive.microsoft.com\/speechtotext\/v3.0\/transcriptions\/be783fbc-2836-480b-b678-76363dc0d0a7",
"invocationId":"d00d3f00-2122-4c81-b5e6-1ce026805e7d"
}
标题就像(秘密是:aBdneoSDSDjw34dfsd2)
"x-microsoftspeechservices-signature":"zsPn2yNhsx9XYABxSqCtNHh3bnCMFL4zGTsdUhGjAGw="
所以,根据文档,我可以用我的秘密加密 sha256 中的有效负载,并且应该得到相同的签名,对吧?
$secret= "aBdneoSDSDjw34dfsd2";
$sig = $request->header("X-MicrosoftSpeechServices-Signature");
$data = json_encode($request->getContent());
$sign = hash_hmac(
'sha256',
$data ,
$secret,
true //use binary necessary??
);
dd($sig, $sign);
不幸的是,这些值不匹配。由于签名看起来像是另外进行了 base64 编码,所以我也尝试过:
dd($sig, base64_encode($sign ));
而且至少字符长度是一样的,但还是不匹配。我在这里想念什么?