5

我们使用Rauth连接到各种 OAuth 1 API。它适用于单个请求,但尝试对给定会话执行 2 个或更多请求会导致来自 API 的 401 未授权错误。

推特 API 示例:

import requests
from rauth import OAuth1Service
from rauth import OAuth1Session

consumer_key = {the consumer key}
consumer_secret = {the consumer secret}
access_token = {the access token}
access_token_secret = {the access token secret}

oauth_service = OAuth1Service(consumer_key = consumer_key, 
                            consumer_secret = consumer_secret)
oauth_session = oauth_service.get_session(token = (access_token, access_secret))

url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'
params = {'include_rts': 'true'}
r = oauth_session.get(url, params=params) # THIS WORKS
r = oauth_session.get(url, params=params) # THIS RETURNS 401 ERROR

这在 Twitter 和 LinkedIn API 上都会发生。我们如何对单个OAuth1Session对象执行多个请求?

版本:
rauth==0.5.4
请求==1.1.0


更新:

奇怪的是,如果params不包含参数,则可以发出多个请求 - 但一旦params包含,即使它是空字典,我们也会得到 401。

示例 1:

r = oauth_session.get(url) # THIS WORKS
r = oauth_session.get(url) # THIS WORKS

示例 2:

r = oauth_session.get(url, params={}) # THIS WORKS
r = oauth_session.get(url, params={}) # THIS RETURNS 401 ERROR
4

1 回答 1

3

从评论中继承,使用session.get(..., header_auth=True)应该可以解决问题。很难确切地说为什么没有这个它就不能工作,但是为了记录,规范更喜欢基于标头的身份验证,并且鉴于 Twitter 的立场,如果他们也更喜欢它作为提供者,我不会感到惊讶。

快速搜索会发现几十个关于他们的 API 在表面上应该工作的地方失败的报告,一个补救措施是更喜欢标头身份验证。据我所知,rauth 正在适当地签名,所以这可能与提供者显示偏好和处理非标头身份验证请求的方式有关。

更新

看起来 rauth 或 Requests 没有正确处理参数。这很奇怪,因为签名基本字符串oauth_signature似乎是正确的,因为它们在每个相应的请求上都存在适当的不同,并且它们所操作的数据似乎要签出。所以看起来它应该已经验证了请求。

无论如何,为了纠正这个问题,我们需要对可变类型的请求参数的元素进行深度复制,例如字典。我有一个补丁可以纠正这个问题,所以你应该可以在没有header_auth. 但是,标头身份验证是首选方法,因此我仍然推荐它。

于 2013-04-26T18:14:30.123 回答