Skip to content

Commit

Permalink
WIP: Implement OAuth2 user token autorefresh.
Browse files Browse the repository at this point in the history
  • Loading branch information
Eric Toombs committed Jan 20, 2023
1 parent 0cd96b1 commit c983dc0
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 13 deletions.
26 changes: 25 additions & 1 deletion tweepy/auth.py
Expand Up @@ -193,13 +193,37 @@ class OAuth2UserHandler(OAuth2Session):
.. versionadded:: 4.5
"""

def __init__(self, *, client_id, redirect_uri, scope, client_secret=None):
def __init__(
self, *, client_id, redirect_uri, scope, client_secret=None,
auto_refresh=True, token_updater=None
):
super().__init__(client_id, redirect_uri=redirect_uri, scope=scope)

if client_secret is not None:
self.auth = HTTPBasicAuth(client_id, client_secret)
else:
self.auth = None

if auto_refresh:
self.token_updater = token_updater
self.auto_refresh_url = 'https://api.twitter.com/2/oauth2/token'
self.auto_refresh_kwargs = {'client_id': client_id}

@classmethod
def from_token(
cls, token, *, client_id, redirect_uri, client_secret=None,
token_updater=None
):
"""Make an OAuth2UserHandler from a token dict returned by
fetch_token() or from the .token field in a previous session."""
h = cls(
client_id=client_id, redirect_uri=redirect_uri,
scope=token['scope'], client_secret=client_secret,
token_updater=token_updater
)
h.token = token
return h

def get_authorization_url(self):
"""Get the authorization URL to redirect the user to"""
authorization_url, state = self.authorization_url(
Expand Down
25 changes: 13 additions & 12 deletions tweepy/client.py
Expand Up @@ -41,11 +41,12 @@
class BaseClient:

def __init__(
self, bearer_token=None, consumer_key=None, consumer_secret=None,
access_token=None, access_token_secret=None, *, return_type=Response,
wait_on_rate_limit=False
self, bearer_token=None, session=requests.Session(), consumer_key=None,
consumer_secret=None, access_token=None, access_token_secret=None, *,
return_type=Response, wait_on_rate_limit=False
):
self.bearer_token = bearer_token
self.session = session
self.consumer_key = consumer_key
self.consumer_secret = consumer_secret
self.access_token = access_token
Expand All @@ -54,7 +55,6 @@ def __init__(
self.return_type = return_type
self.wait_on_rate_limit = wait_on_rate_limit

self.session = requests.Session()
self.user_agent = (
f"Python/{python_version()} "
f"Requests/{requests.__version__} "
Expand All @@ -65,14 +65,15 @@ def request(self, method, route, params=None, json=None, user_auth=False):
host = "https://api.twitter.com"
headers = {"User-Agent": self.user_agent}
auth = None
if user_auth:
auth = OAuth1UserHandler(
self.consumer_key, self.consumer_secret,
self.access_token, self.access_token_secret
)
auth = auth.apply_auth()
else:
headers["Authorization"] = f"Bearer {self.bearer_token}"
if type(self.session) == requests.Session:
if user_auth:
auth = OAuth1UserHandler(
self.consumer_key, self.consumer_secret,
self.access_token, self.access_token_secret
)
auth = auth.apply_auth()
else:
headers["Authorization"] = f"Bearer {self.bearer_token}"

log.debug(
f"Making API request: {method} {host + route}\n"
Expand Down

0 comments on commit c983dc0

Please sign in to comment.