Azures语音到文本webhook标头X-MicrosoftSpeechServices-Signature算法



我正试图在php中实现一个身份验证中间件,用于azures语音到文本api的webhook回调。

我想使用X-MicrosoftSpeechServices-Signature标头进行此操作。docs声明,这是有效载荷的sha256加密值,密钥为secret。

假设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 ));

至少字符长度是一样的,但仍然不匹配。我在这里错过了什么?

我让它与以下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')

最新更新