【问题标题】:Multiple requests over a Rauth OAuth 1.0 sessionRauth OAuth 1.0 会话上的多个请求
【发布时间】:2013-04-20 22:13:57
【问题描述】:

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

Twitter 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 对象执行多个请求?

版本:
劳斯==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

【问题讨论】:

  • 在第一次和第二次调用get 之间发生了什么事吗?我刚刚尝试了Twitter example,它似乎工作正常。
  • @maxcountryman - 不,我完全按照示例所示调用它们。看看我的更新...
  • 如果你得到一个新的会话实例会发生什么? (顺便说一句,如果您使用服务包装器,这会变得容易得多。)
  • 我们可以为每个请求创建一个新会话,但这样做效率低下并且破坏了会话对象的全部意义,不是吗?至于服务包装器,每次都需要生成新的令牌——但我们存储和重用客户的令牌,所以我们没有使用服务包装器。
  • 您可以使用服务包装器来吐出新的会话对象,如下所示:my_service.get_session(tokens) 这比每次使用Session 对象要干净得多。但是,您应该能够重用会话实例,因此它可能是一个错误。也许在 GitHub 上开一张票会更好?

标签: python oauth rauth


【解决方案1】:

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

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

更新

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

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

【讨论】:

  • @maxcountryman- 非常感谢。在这个库上做得很好 - 非常需要。
猜你喜欢
  • 2018-04-12
  • 2020-01-20
  • 2018-01-16
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多