laravel - Azure 语音到文本 Webhook header X-MicrosoftSpeechServices-Signature 算法?

标签 laravel azure azure-cognitive-services azure-speech

我正在尝试在 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/

相关文章:

c# - 如何检索 Azure 表中的最新行?

azure - Angular2 - 在 Azure 中托管时页面刷新 404ing

botframework - Microsoft 认知服务 Web 搜索 API - 反序列化问题

r - 在 R 中使用 Azure 计算机视觉创建循环/分析多个图像的方法

c# - 如何使用 Microsoft Cognitive Services - Vision API 的 OCR 识别功能仅获取文本?

sql - 不要在 Laravel Eloquent ORM 中使用准备好的语句?

php - 当 Laravel 队列 :listen times out 时获取当前正在运行的任务

javascript - 如何在 vuejs 组件中使用 laravel csrf token

laravel - 调用未定义的方法 Laravel\Lumen\Routing\Router::middleware()

java - 从公共(public) Internet 访问专用网络上网关后面的计算机上的 REST 端点