You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure ACS:CreateCall调用成功但CallMedia Play鉴权失败求助

问题:CallMedia Play API调用时HMAC-SHA256验证失败(错误码7509)

问题描述

遵循Azure通信服务Postman教程调用CreateCall API正常,但使用返回的callConnectionId调用CallMedia Play API时,持续收到错误:

{
"error": {
"code": "7509",
"message": "HMAC-SHA256 validation failed"
}
}

调用Play API的请求体

{
  "playSources": [
    {
      "kind": "text",
      "text": {"voiceKind": "male", "text": "Hello. This is Microsoft calling. If you are trying to authenticate, please press the pound or hash key now", "sourceLocale" : "en-US"}
    }
  ],
  "playTo": [
    {
        "phoneNumber": {
            "value": "+11231230672"
        }
    }
   ]
}

已尝试的操作

  • 修改Authorization请求头,将原脚本:
    pm.request.headers.upsert({
        key:'Authorization',
        value: "HMAC-SHA256 SignedHeaders=date;host;x-ms-content-sha256&Signature=" + signature
    });
    
    修改为:
    pm.request.headers.upsert({ key:'Authorization', value: "HMAC-SHA256 Credential=" + pm.variables.get("credential") + "&SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=" + signature });
    
    但出现“invalid header parameter”错误。
  • 尝试硬编码端点、URL,问题未解决。

解决方案

针对HMAC-SHA256验证失败的问题,从以下几个关键维度排查修正:

1. 确保x-ms-date头格式与签名计算完全一致

  • x-ms-date必须使用RFC1123格式(如Tue, 15 Nov 1994 08:12:31 GMT),且签名生成时使用的日期字符串必须和请求头中的x-ms-date完全相同,不能存在时间差。
  • 避免使用date头,统一用x-ms-date,并确保SignedHeaders中包含x-ms-date而非date。

2. 正确计算x-ms-content-sha256头

Play API为POST请求,必须计算请求体的SHA256哈希(Base64编码)并设置到x-ms-content-sha256头中,哈希需与请求体完全匹配(包括空格、换行符等细节)。
在Postman前置脚本中添加以下代码自动计算:

const body = pm.request.body.raw;
const sha256Hash = CryptoJS.SHA256(body).toString(CryptoJS.enc.Base64);
pm.request.headers.upsert({ key: 'x-ms-content-sha256', value: sha256Hash });

3. 修正Authorization头格式

正确的Authorization头格式必须包含Credential、SignedHeaders、Signature三个部分,注意符号和空格:

const acsKey = pm.variables.get("acs-access-key"); // 替换为你的ACS密钥变量名
const signedHeaders = "x-ms-date;host;x-ms-content-sha256";
// 确保signature是基于正确的待签名字符串生成的
const authorizationValue = `HMAC-SHA256 Credential=${acsKey}&SignedHeaders=${signedHeaders}&Signature=${signature}`;
pm.request.headers.upsert({ key: 'Authorization', value: authorizationValue });
  • 检查Credential的值是否是完整的ACS访问密钥,无多余字符。
  • 确保SignedHeaders中的头名称与请求中实际存在的头完全一致(顺序不影响,但名称必须准确)。

4. 验证待签名字符串的正确性

生成签名的待签名字符串必须严格遵循Azure的格式,示例如下(替换为你的实际参数):

POST
/callautomation/calls/{your-callConnectionId}/media/play?api-version=2023-10-15
host:your-resource.communication.azure.com
x-ms-content-sha256:xxxxxx
x-ms-date:Tue, 15 Nov 1994 08:12:31 GMT

  • 注意每行末尾的换行符,最后一行(头部分结束后)需保留一个空行。
  • 路径必须包含完整的api-version参数,与请求URL中的版本一致(你使用的是2023-10-15)。
  • host值为请求的域名,不带https://或端口号。

5. 检查URL与参数正确性

  • 确认callConnectionId完全复制自CreateCall API的返回结果,无拼写错误。
  • 确认请求URL的端点是正确的Azure通信服务域名(如your-resource.communication.azure.com)。

内容的提问来源于stack exchange,提问作者Ronnie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 07:45:08