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 });
但出现“invalid header parameter”错误。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 }); - 尝试硬编码端点、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
相关产品推荐
相关产品推荐

