E-Trade API GET正常POST返回invalid_signature错误如何调试
E-Trade API POST请求401签名无效调试方案
核心差异排查
对比你提供的Python成功请求和Ruby失败请求的Authorization头,最明显的差异是Ruby请求多了oauth_body_hash字段,这是绝大多数此类签名错误的诱因:
- ruby的oauth gem默认会对非
application/x-www-form-urlencoded类型的POST请求自动计算并添加body hash参数,但E-Trade API在校验签名时不会将该参数纳入计算范围,导致两端生成的签名基准串不一致,最终签名校验失败。
分步调试操作
- 第一步:禁用body hash自动添加逻辑
在初始化OAuth Consumer时添加配置项:body_hash_enabled => false,或者在生成Authorization头后手动删除oauth_body_hash字段及其值,再发起请求测试。 - 第二步:对齐签名基准串
签名基准串是OAuth1.0签名计算的核心,格式为HTTP_METHOD&URL编码后的请求地址&URL编码后的排序后参数串,你可以分别打印Python和Ruby两端生成的签名基准串逐字符对比,重点检查:- 请求方法是否为大写的POST
- 请求地址是否完全一致(包含协议、域名、路径,无多余查询参数)
- 参与签名的参数列表是否完全相同,排除多余参数
- 第三步:校验签名密钥
HMAC-SHA1签名的密钥格式为URL编码后的Consumer Secret&URL编码后的Access Token Secret,确认两端使用的密钥完全一致,没有多余转义或字符遗漏。 - 第四步:本地交叉验证
把Python成功请求的所有OAuth参数、请求方法、请求地址、密钥导入Ruby的oauth库中重新计算签名,如果计算结果和Python端的签名一致,说明你原有Ruby请求存在多余参数;如果不一致则检查密钥和参数排序规则。
签名校验工具说明
不建议使用在线OAuth校验工具,此类工具需要你传入Consumer Secret和Access Token Secret,存在密钥泄露风险。你可以直接用Ruby写一段极简脚本,代入已知正确的请求参数即可完成签名有效性校验,无需依赖第三方工具。
内容的提问来源于stack exchange,提问作者Chuck Remes
相关产品推荐
相关产品推荐

