OAuth签名问题

时间:2013-04-16 21:44:23

标签: python python-2.7 oauth intuit-partner-platform rauth

我正在尝试使用rathon库中的python连接到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库的问题吗?我是否遗漏了一个能让它更稳定的参数?

2 个答案:

答案 0 :(得分:2)

Rauth作者:

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

实际上,这不一定是真的:它确实表明提供商无法验证请求并且表明签名不正确。但这也可能意味着签名完全丢失(顺便提一下,这在技术上是不正确的)。我会尝试将header_auth设置为False。这是一个常见问题,即提供程序不准备处理基于标头的身份验证,然后混淆地返回signature_invalid错误。

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

最后,如果您仍有问题,请随时与我联系或在GitHub repo上打开问题。

答案 1 :(得分:0)

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

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

    我注意到的唯一区别是参数的顺序不同,但是oauth参数可能被视为已签名内容的一部分,然后在生成签名后被覆盖,使其无效。无论原因是什么,这一变化修复了我所获得的90%的失败。

  2. 按照maxcountryman的建议将header_auth重置回False。即使spec for qbo requests说要将身份验证放在标题中,显然这并不总是有效。我使用此设置获得的错误率仅为10%左右,但如果没有它,我将不再收到任何签名错误。