请求Restricted Data Token时亚马逊返回‘String-to-Sign应为’错误如何调试?
关于返回的String-to-Sign的误解
亚马逊返回的待签名字符串并不是格式错误,只是报错输出时丢失了换行符。标准AWS V4签名的待签名字符串固定为4行结构,拼接后就是你看到的长串:
- 第一行:签名算法
AWS4-HMAC-SHA256 - 第二行:请求时间
20211201T141644Z - 第三行:凭证范围
20211201/eu-west-1/execute-api/aws4_request - 第四行:规范请求的SHA256哈希值
da72cd0eaab649d1219a0316d8a19360f10c2d9bb10fe716bc828fac408d2647
你之前混淆了待签名字符串和最终请求携带的Authorization头的结构,二者是完全不同的两个概念,不存在格式异常。
核心错误点
从报错信息可以直接定位到2个核心问题:
- 请求方法错误:你使用了
GET方法请求RDT端点,而/tokens/2021-03-01/restrictedDataToken端点要求必须使用POST方法,GET请求无法携带必填的请求体参数,直接触发签名校验失败。 - 请求体哈希计算错误:你报错信息里的规范请求哈希为
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,这是SHA256算法对空字符串的计算结果,说明你签名时使用了空请求体计算哈希,但RDT请求必须在POST body中携带restrictedResources等JSON参数,签名时需要用实际发送的请求体内容计算哈希。
调试步骤
按以下顺序排查即可解决问题:
- 将请求方法改为
POST,不要使用GET - 构造签名用的规范请求时,所有参数要和实际发送的请求完全一致:
- 请求方法填
POST,URI填/tokens/2021-03-01/restrictedDataToken - 计算请求体SHA256哈希时,使用实际发送的JSON序列化字符串,不要有多余的空格、换行或格式调整
- 签名头列表(SignedHeaders)要包含所有实际请求携带的头,顺序和头名称大小写要完全匹配
- 请求方法填
- 确认签名使用的凭证区域为
eu-west-1,和欧盟端点的要求匹配 - 确认LWA令牌的权限包含
sellingpartnerapi::migration:tokensscope,无权限也会触发签名类错误误导排查
内容的提问来源于stack exchange,提问作者TomR
相关产品推荐
相关产品推荐

