5

Rauthを使用して、さまざまな OAuth 1 API に接続しています。1 つのリクエストに対しては正常に機能しますが、指定されたセッションに対して 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 API と 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 が失敗しているというレポートが何十件も見つかります。1 つの解決策は、ヘッダー認証を優先することです。私が知る限り、rauth は適切に署名しているため、おそらくこれは、プロバイダーが設定を表示し、非ヘッダー認証リクエストを処理する方法に関係しています。

アップデート

rauth または Requests がパラメータを適切に処理していないようです。署名ベース文字列 とoauth_signatureが正しいように見えたため、それぞれの要求で適切に異なり、操作されたデータがチェックアウトされたように見えたため、奇妙です。したがって、リクエストを検証する必要があるようです。

いずれにせよ、これを修正するには、辞書などの変更可能な型であるリクエスト パラメータの要素をディープコピーする必要があります。これを修正するパッチを入手したので、これを使用せずに使用できるはずですheader_auth。ただし、ヘッダー認証が推奨される方法であるため、引き続きお勧めします。

于 2013-04-26T18:14:30.123 に答える