我正在尝试在 php 中实现一个身份验证中间件,用于 azures 语音到文本 api 的 webhook 回调。
我想为此使用 X-MicrosoftSpeechServices-Signature header 。 docs声明,这是有效负载的 sha256 加密值,以 key 作为 key 。
假设 Webhook 发回如下请求:
{
"self":"https:\/\/southcentralus.api.cognitive.microsoft.com\/speechtotext\/v3.0\/transcriptions\/be783fbc-2836-480b-b678-76363dc0d0a7",
"invocationId":"d00d3f00-2122-4c81-b5e6-1ce026805e7d"
}
标题就像( secret 是:aBdneoSDSDjw34dfsd2)
"x-microsoftspeechservices-signature":"zsPn2yNhsx9XYABxSqCtNHh3bnCMFL4zGTsdUhGjAGw="
所以,根据文档,我可以用我的 secret 对 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 ));
而且至少字符长度是一样的,但还是不匹配。我在这里缺少什么?
最佳答案
我让它与以下 python 代码片段一起工作:
hmac_key = '1234567890'
# In case of 'x-microsoftspeechservices-event': 'TranscriptionCompletion'
if (event.get('body')):
hmac_digest = hmac.new(hmac_key.encode(), event['body'].encode(), digestmod=hashlib.sha256).digest()
b64dig = base64.b64encode(hmac_digest).decode()
# In case of 'x-microsoftspeechservices-event': 'Challenge'
elif (event.get('queryStringParameters')):
hmac_digest = hmac.new(hmac_key.encode(), event['queryStringParameters']['validationToken'].encode(), digestmod=hashlib.sha256).digest()
b64dig = base64.b64encode(hmac_digest).decode()
else:
b64dig = ""
print (b64dig)
print (event['headers']['x-microsoftspeechservices-signature'])
if b64dig == event['headers']['x-microsoftspeechservices-signature']:
print ('valid')
else:
print ('invalid')
关于laravel - Azure 语音到文本 Webhook header X-MicrosoftSpeechServices-Signature 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71081339/