现在我一直在与OAuth和Twitter争夺2周,试图实施它.经过多次重写我的代码后,我终于得到了一个执行请求的库,因为它应该基于1.0规范.我已经通过在Google Code上使用此验证程序以及来自Hueniverse的此验证程序验证了它.
我的版本,谷歌版本和Hueniverse版本都产生完全相同的签名,所以我得出的结论是我不再是原因(但我可以通过陈述这一点来填补我的嘴巴).
我通过首先使用Twitter的API控制台创建测试请求来测试我的实现,在这种情况下是状态更新.我将改变的参数,oauth_nonce和oauth_timestamp复制到上面提到的所有三个签名者中.所有其他参数总是相同的,令牌/秘密/等.
Twitter的控制台产生一个签名,但其他三个签名产生不同的签名(来自Twitter,彼此相同).
所以,我的问题是,为什么我得到这个:
<?xml version="1.0" encoding="UTF-8"?>
<hash>
<request>/1/statuses/update.xml</request>
<error>Could not authenticate with OAuth.</error>
</hash>
Run Code Online (Sandbox Code Playgroud)
...当我应该将规范实施到"T"时?
作为请求的一部分,Twitter是否需要特定的东西?我把Twitter生成的nonce统计为42个字符长,这是正确的吗?应该是42个字符吗?
我非常感谢任何对API有深入了解的人的帮助,而不是我明显拥有的......
提前致谢!
更新:有人问我如何发送身份验证参数,但后来删除了他们的帖子,idk为什么.无论如何,授权参数通过Authorization标头发送.
更新/解决方案: 向下移动到它所属的底部作为答案.
有点晚了,但根据 @poke 的建议,我在这里添加我的答案:
于是我就想通了,其实这很愚蠢。不久前,可能是重写 3,我从 Twitter 收到了错误的非 XML 响应。然后我在 Twitter API 控制台中看到它们转义了 header params: param=\"value\"。我添加了反斜杠,立即就得到了 XML 响应。所以它卡住了。
不管怎样,为了排除重写 7(或 8)中的所有问题,我决定从标头参数字符串中删除反斜杠,它解决了所有问题。
因此,从这一切中吸取的教训是,并非 Twitter API 控制台显示的所有内容都应该被模仿。我实际上会进一步建议 Twitter 更新控制台以显示发送时标头字符串的样子,而不是他们的系统内部生成的内容(解析反斜杠字符)。