FatSecret API签名无效求助:携带oauth_token时请求失败
嘿,我太懂这种被OAuth签名错误卡壳的滋味了——之前对接第三方API时也跟这个错误死磕了大半天。结合你给出的代码片段,咱们从最容易踩坑的几个点逐一排查:
Nonce与Timestamp的准确性
你用[NSString ab_GUID]生成nonce是没问题的,但要注意两个细节:- Timestamp必须是秒级Unix时间戳,不能用毫秒,而且要保证本地时间和服务器时间差在几分钟内(很多服务会拒绝时间偏差太大的请求)
- Nonce必须每次请求都唯一,绝对不能重复使用同一个值
请求URL的标准化处理
生成签名基字符串时,URL必须是剥离了查询参数的纯路径URL(比如https://api.yourdomain.com/v1/resource,不能带?foo=bar这类参数),同时要严格匹配服务器要求的协议、域名和路径大小写——别小看这点,把https写成http或者路径大小写不一致,直接就会导致签名不匹配请求方法的大小写规范
OAuth协议明确要求请求方法必须是大写(比如GET、POST),如果你的method参数传的是小写get,签名肯定对不上,这是很容易忽略的细节POST请求Body的处理规则
如果是application/x-www-form-urlencoded类型的POST请求,必须把Body里的所有参数都加入签名基字符串的参数列表;如果是JSON格式的Body,有些服务会要求忽略Body,只签名URL和OAuth参数——一定要确认目标服务的具体规则,别瞎加或者漏加参数签名密钥的拼接逻辑
签名密钥的格式是固定的:URLEncode(consumerSecret)&URLEncode(tokenSecret),注意这里的&是直接拼接,哪怕tokenSecret为空,也要保留末尾的&(比如URLEncode(consumerSecret)&)。很多错误都是这里的拼接或者编码出了问题OAuth参数的完整性与排序
签名基字符串必须包含所有必填OAuth参数:oauth_consumer_key、oauth_nonce、oauth_signature_method(一般是HMAC-SHA1,要和服务要求一致)、oauth_timestamp、oauth_token、oauth_version(通常是1.0)。这些参数要和请求参数一起按参数名的ASCII升序排序,再拼接成键值对,顺序错了签名就会失效编码的严格性
所有参数名和值都必须遵循RFC 3986标准编码:空格要转成%20而不是+,特殊字符比如!、*、(也要正确编码。很多时候看起来没问题的代码,就是因为编码不规范导致签名偏差
最后给你个调试小技巧:固定timestamp和nonce,用在线OAuth 1.0签名工具手动生成签名,再和你的代码生成的签名对比。如果签名不一致,就一步步对比签名基字符串和签名密钥,很快就能找到哪里出问题了。
内容的提问来源于stack exchange,提问作者Jorge

