0

我正在尝试将 python 与 rauth 库一起使用来连接到 intuit 合作伙伴平台上的 QBO api,而且我大部分时间都让它正常工作。但是,我在发送请求时经常遇到错误:

Exception authenticating OAuth; errorCode=003200; statusCode=401

此消息在失败时也位于响应标头中:

WWW-Authenticate: OAuth oauth_problem="signature_invalid"

错误代码表明请求没有被正确签名,但我使用标准 oauth 库来自动签署数据,并且它在大约一半的时间内工作。我的连接代码如下:

if method is 'post':
    headers = {}
        if action in ['create', 'update', 'delete']:
            headers['Content-Type'] = 'application/xml'
        r = self.session.post(url, data=data, headers=headers, params=params, header_auth=True)
else:
    r = self.session.get(url, params=params, header_auth=True)

其中 self.session 是一个 rauth.OAuth1Session。

生成请求的示例是:

GET /resource/customer/v2/682571780/1 HTTP/1.1
Host: qbo.sbfinance.intuit.com
Accept: */*
Content-Length: 0
Accept-Encoding: gzip, deflate, compress
authorization: OAuth realm="",oauth_nonce="d577f23920c96f8ee79eff6588c83c9ebf65cf20",oauth_timestamp="1366147949",oauth_consumer_key="qyprdCFOHBypPTK8XX0g8N4bZ8ceVA",oauth_signature_method="HMAC-SHA1",oauth_version="1.0",oauth_token="qyprdp9p7diRBIt11In225OOGRzcgl9o4DsQRJduHJFP09gY",oauth_signature="w5V3u2ATnj/rDc9vFD7inr8MO6I%3D"
User-Agent: python-requests/1.1.0 CPython/2.7.3 Linux/3.5.0-17-generic

这是 rauth 库的问题吗?我是否遗漏了一个可以使其更稳定的参数?

4

2 回答 2

2

劳斯作者在这里:

“错误代码表明请求未正确签名......”

实际上,这不一定是真的:它确实表明提供者无法验证请求并且表明签名不正确。但这也可能意味着签名完全丢失(顺便说一句,这在技术上是不正确的)。我会尝试设置header_authFalse. 这是一个常见问题,提供者不准备处理基于标头的身份验证,然后令人困惑地返回 signature_invalid 错误。

此外,您提到您正在使用库来自动签署请求,除了 rauth 之外,还有一个库吗?如果是这样,我强烈建议不要这样做:rauth 是独立的,并且会为您签名。您应该避免将其与其他 OAuth 库结合使用。

最后,如果您仍然遇到问题,请随时直接与我联系或在GitHub 存储库上打开问题。

于 2013-04-16T22:37:49.733 回答
0

好的,事实证明我的问题的完整解决方案需要两个更改:

  1. 在某些情况下,我传递的params对象在请求之间被保留,但在设置请求时显然被破坏性修改。这意味着 oauth 参数包含在下一个请求中,这以某种方式干扰了 rauth 的设置。

    我注意到的唯一区别是参数的顺序不同,但有可能 oauth 参数被视为签名内容的一部分,然后在生成签名后被覆盖,使其无效。不管是什么原因,这个改变解决了我遇到的 90% 的故障。

  2. 按照maxcountryman的建议header_auth重新设置False。尽管qbo 请求的规范说将身份验证放在标头中,但显然这并不总是有效。我使用此设置得到的错误率只有 10% 左右,但没有它我不再收到任何签名错误。

于 2013-04-17T14:25:54.107 回答