使用curl调用Tuya API时签名无效(错误码1004)求助
问题描述
调用Tuya API时始终返回签名无效错误:
{"code":1004,"msg":"sign invalid","success":false,"t":1664314067553}
已确认签名生成逻辑符合HMAC-SHA256(client_id + t, secret)规则,且通过文档示例验证签名正确,但请求时失败。怀疑是时间同步或签名与请求的t不匹配问题,当前脚本如下:
t=($(($(date +%s%N)/1000000))); sign1=$(echo -n "yyr8hxxxxxxxxd4mji$t" | openssl dgst -sha256 -hmac "cc75fd7xxxxxxxxx63d032b" | awk '{print$2}') && sign2=$(echo ${sign1^^}) ; curl --request POST "https://openapi.tuyaeu.com/v1.0/iot-03/devices/717715xxxxxxx520/commands" --header "sign_method: HMAC-SHA256" --header "client_id: yyr8hxxxxxxxxd4mji" --header "t: t" --header "mode: cors" --header "sign: $sign2" --header "access_token: cc75fd7xxxxxxxxx63d032b" --data "{\"commands\":[{\"code\":\"switch_1\",\"value\":true}]}"
解决方案
1. 修复请求头的t参数错误
脚本中--header "t: t"是硬编码字符串t,并非生成签名时使用的13位时间戳变量,必须改成--header "t: $t",这是导致签名不匹配的核心原因。
2. 修正access_token的错误使用
你把secret值填到了access_token字段里,这是完全错误的:
secret是用于生成签名的密钥access_token需要通过Tuya的授权接口(如/v1.0/token)获取,不能直接用secret替代
3. 优化签名生成的可靠性
用printf替代echo -n,避免不同环境下echo的换行行为差异:
sign1=$(printf "%s%s" "yyr8hxxxxxxxxd4mji" "$t" | openssl dgst -sha256 -hmac "cc75fd7xxxxxxxxx63d032b" | awk '{print $2}')
4. 同步系统时间
确保本地系统时间与Tuya服务器时间误差在5分钟以内,可通过NTP同步:
# Ubuntu/Debian sudo ntpdate pool.ntp.org # CentOS/RHEL sudo chronyc makestep
修复后的完整脚本示例
# 获取13位毫秒时间戳 t=$(($(date +%s%N)/1000000)) # 生成签名(转大写) sign=$(printf "%s%s" "yyr8hxxxxxxxxd4mji" "$t" | openssl dgst -sha256 -hmac "cc75fd7xxxxxxxxx63d032b" | awk '{print $2}' | tr '[:lower:]' '[:upper:]') # 替换为你实际获取到的access_token access_token="your_real_access_token" # 发起POST请求 curl --request POST "https://openapi.tuyaeu.com/v1.0/iot-03/devices/717715xxxxxxx520/commands" \ --header "sign_method: HMAC-SHA256" \ --header "client_id: yyr8hxxxxxxxxd4mji" \ --header "t: $t" \ --header "sign: $sign" \ --header "access_token: $access_token" \ --data '{"commands":[{"code":"switch_1","value":true}]}'
内容的提问来源于stack exchange,提问作者Porcac1x
相关产品推荐
相关产品推荐

