如何授权Zadarma API?解决n8n调用时401未授权问题
解决Zadarma API外呼401未授权问题(n8n环境)
核心问题分析
你遇到的401错误大概率来自签名生成逻辑的疏漏,结合Zadarma官方签名规则,你的代码存在以下几个关键问题:
- 未定义
API_USER_KEY变量,导致认证头缺失关键信息 - 查询参数未强制按字典序排序(Zadarma要求参数必须按键名字典序排列)
- Base64编码可能产生多余换行,破坏签名完整性
修正后的签名生成代码
API_USER_KEY='{{$json["api_user_key"]}}' API_SECRET_KEY='{{$json["api_secret_key"]}}' METHOD='/v1/request/callback/' FROM='{{$json["from"]}}' TO='{{$json["to"]}}' SIP='{{$json["sip"] || ""}}' PRED='{{$json["predicted"] || ""}}' # 按字典序收集参数片段 QS_PARTS=() [ -n "$FROM" ] && QS_PARTS+=("from=${FROM}") [ -n "$PRED" ] && QS_PARTS+=("predicted=${PRED}") [ -n "$SIP" ] && QS_PARTS+=("sip=${SIP}") [ -n "$TO" ] && QS_PARTS+=("to=${TO}") # 排序后拼接成完整查询字符串 IFS='&' QS="${QS_PARTS[*]}" unset IFS # 生成查询字符串的MD5哈希(小写) MD5Q=$(printf "%s" "$QS" | md5sum | awk '{print $1}') # macOS环境请替换为:MD5Q=$(printf "%s" "$QS" | openssl md5 | awk '{print $2}') # 生成签名,避免Base64自动换行 SIG=$(printf "%s%s%s" "$METHOD" "$QS" "$MD5Q" | openssl dgst -sha1 -hmac "$API_SECRET_KEY" -binary | base64 -A) # macOS环境请替换Base64部分为:| base64 -b 0 URL="https://api.zadarma.com${METHOD}?${QS}" AUTH="${API_USER_KEY}:${SIG}" printf '{"url":"%s","authorization":"%s"}' "$URL" "$AUTH"
n8n配置步骤
- 添加Shell节点,粘贴上述代码,确保输入JSON包含
api_user_key、api_secret_key、from、to等必填字段 - 添加HTTP Request节点,设置请求方法为
GET,URL填写{{$json["url"]}} - 在HTTP Request节点的Headers中新增
Authorization头,值填写{{$json["authorization"]}} - 执行流程测试,验证外呼请求是否成功
额外排查点
- 确认
API_USER_KEY和API_SECRET_KEY无复制错误或多余空格 - 检查
from号码格式是否符合Zadarma要求(需带国家码,如+123456789) - 验证SIP账号在Zadarma平台已激活且具备外呼权限
- 可本地用Zadarma官方签名逻辑对比生成结果,确认签名正确性
内容的提问来源于stack exchange,提问作者Mookie loves Cookie
相关产品推荐
相关产品推荐

