From 7a1e98189bb8937de13fae783b72c7598f059e23 Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Wed, 25 Dec 2019 23:53:04 -0500 Subject: [PATCH 1/2] working in progress --- requirements.txt | 3 ++- ring_doorbell/__init__.py | 4 ++++ ring_doorbell/generic.py | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 03c5fdd..da33a1d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ pytz -requests +requests==2.22.0 +requests-oauthlib==1.3.0 diff --git a/ring_doorbell/__init__.py b/ring_doorbell/__init__.py index e1f989a..db026d7 100644 --- a/ring_doorbell/__init__.py +++ b/ring_doorbell/__init__.py @@ -10,6 +10,10 @@ import time import requests +from requests_oauthlib import OAuth2Session +from oauthlib.oauth2 import TokenExpiredError + + from ring_doorbell.utils import _exists_cache, _save_cache, _read_cache from ring_doorbell.const import ( diff --git a/ring_doorbell/generic.py b/ring_doorbell/generic.py index 7177150..66fac99 100644 --- a/ring_doorbell/generic.py +++ b/ring_doorbell/generic.py @@ -45,6 +45,7 @@ def model(self): """Return Ring device model name.""" return None + # pylint: disable=no-self-use def has_capability(self, capability): """Return if device has specific capability.""" return False From 279d6777366fc82d9268cea0cc7eb4351d149563 Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Thu, 26 Dec 2019 02:51:08 -0500 Subject: [PATCH 2/2] working in progress --- ring_doorbell/__init__.py | 57 +++++++++++++++++++++++++++++++++++---- ring_doorbell/const.py | 8 +++++- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/ring_doorbell/__init__.py b/ring_doorbell/__init__.py index db026d7..f450635 100644 --- a/ring_doorbell/__init__.py +++ b/ring_doorbell/__init__.py @@ -39,6 +39,8 @@ def __init__(self, username, password, debug=False, persist_token=False, """Initialize the Ring object.""" self.is_connected = None self.token = None + self.access_token = None + self.refresh_token = None self.params = None self._persist_token = persist_token self._push_token_notify_url = push_token_notify_url @@ -92,7 +94,50 @@ def _process_cached_session(self): self._authenticate() def _get_oauth_token(self): - """Return Oauth Bearer token.""" + """ + Oauth Bearer token. + + Acquires the Bearer access_token and refresh_token. + """ + + oauth_data = OAUTH_DATA.copy() + oauth_data['username'] = self.username + oauth_data['password'] = self.password + + + from oauthlib.oauth2 import LegacyApplicationClient + from requests_oauthlib import OAuth2Session + + import rpdb; rpdb.set_trace() + + client_id = oauth_data.get('client_id') + client = LegacyApplicationClient(client_id) + #client.prepare_request_body( + # username=self.username, + # password=self.password, + # scope='client') + + oauth = OAuth2Session(client) + token = oauth.fetch_token( + token_url=OAUTH_ENDPOINT, + username=self.username, + password=self.password, + headers=HEADERS, + client_id=client_id) + + #username="My_Username", password="My_Password", client_id=client_Id, + #client_secret=client_Secret, auth=False) + + + + + # for now, don't get a new bearer token if access_token is set + # we will need to use the refresh_token to validate and grab new one + if self.access_token is not None: + print("returning as token is set") + return + + import rpdb; rpdb.set_trace() # this token should be cached / saved for later oauth_data = OAUTH_DATA.copy() oauth_data['username'] = self.username @@ -100,12 +145,12 @@ def _get_oauth_token(self): response = self.session.post(OAUTH_ENDPOINT, data=oauth_data, headers=HEADERS) - oauth_token = None if self.debug: _LOGGER.debug("response from get oauth token %s", str(response)) + if response.status_code == 200: - oauth_token = response.json().get('access_token') - return oauth_token + self.access_token = response.json().get('access_token') + self.refresh_token = response.json().get('refresh_token') def _authenticate(self, attempts=RETRY_TOKEN, session=None, wait=1.0): """Authenticate user against Ring API.""" @@ -115,9 +160,11 @@ def _authenticate(self, attempts=RETRY_TOKEN, session=None, wait=1.0): # which would cause issues with _get_oauth_token() # which expects a non mutated HEADERS copy modified_headers = HEADERS.copy() + self._get_oauth_token() + while loop <= attempts: modified_headers['Authorization'] = \ - 'Bearer {}'.format(self._get_oauth_token()) + 'Bearer {}'.format(self.access_token) loop += 1 try: diff --git a/ring_doorbell/const.py b/ring_doorbell/const.py index 1b15907..a443132 100644 --- a/ring_doorbell/const.py +++ b/ring_doorbell/const.py @@ -13,7 +13,13 @@ RETRY_TOKEN = 3 # default suffix for session cache file -CACHE_ATTRS = {'account': None, 'alerts': None, 'token': None} +CACHE_ATTRS = { + 'account': None, + 'alerts': None, + 'token': None, + 'refresh_token': None, + 'access_token': None +} try: CACHE_FILE = os.path.join(os.getenv("HOME"),