Added auto-reauthorization (token refresh) when a request fails due to an expired token

This commit is contained in:
ttrushin
2017-05-09 14:47:31 -04:00
parent b0cb3dda37
commit 13c7373917
3 changed files with 37 additions and 20 deletions
+4
View File
@@ -3,6 +3,10 @@ Changelog
A list of changes between each release
0.6.0.dev1 (unreleased)
^^^^^^^^^^^^^^^^^^
- Added auto-reauthorization (token refresh) when a request fails due to an expired token
0.6.0.dev0 (unreleased)
^^^^^^^^^^^^^^^^^^
- Removed redundent properties that only called hidden variables
+30 -17
View File
@@ -21,9 +21,14 @@ from helpers.constants import (BLINK_URL, LOGIN_URL,
LOGIN_BACKUP_URL,
DEFAULT_URL, ONLINE)
def _attempt_reauthorization(blink):
"""Attempt to refresh auth token"""
headers = blink.get_auth_token()
blink.set_links()
return headers
def _request(url, data=None, headers=None, reqtype='get',
stream=False, json_resp=True):
def _request(blink, url=url, data=None, headers=None, reqtype='get',
stream=False, json_resp=True, is_retry=False):
"""Wrapper function for request."""
if reqtype == 'post':
response = requests.post(url, headers=headers,
@@ -35,8 +40,13 @@ def _request(url, data=None, headers=None, reqtype='get',
raise BlinkException(ERROR.REQUEST)
if json_resp and 'code' in response.json():
if is_retry:
raise BlinkAuthenticationException(
(response.json()['code'], response.json()['message']))
else:
headers = _attempt_reauthorization(blink)
_request(blink, url=url, data=data, headers=headers, reqtype=reqtype,
stream=stream, json_resp=json_resp, is_retry=True)
if json_resp:
return response.json()
@@ -75,9 +85,10 @@ class BlinkURLHandler(object):
class BlinkCamera(object):
"""Class to initialize individual camera."""
def __init__(self, config, urls):
def __init__(self, config, blink):
"""Initiailize BlinkCamera."""
self.urls = urls
self.blink = blink
self.urls = self.blink.urls
self.id = str(config['device_id']) # pylint: disable=invalid-name
self.name = config['name']
self._status = config['armed']
@@ -99,15 +110,15 @@ class BlinkCamera(object):
def snap_picture(self):
"""Take a picture with camera to create a new thumbnail."""
_request(self.image_link, headers=self.header, reqtype='post')
_request(self.blink, url=self.image_link, headers=self.header, reqtype='post')
def set_motion_detect(self, enable):
"""Set motion detection."""
url = self.arm_link
if enable:
_request(url + 'enable', headers=self.header, reqtype='post')
_request(self.blink, url=url + 'enable', headers=self.header, reqtype='post')
else:
_request(url + 'disable', headers=self.header, reqtype='post')
_request(self.blink, url=url + 'disable', headers=self.header, reqtype='post')
def update(self, values):
"""Update camera information."""
@@ -122,7 +133,7 @@ class BlinkCamera(object):
def image_refresh(self):
"""Refresh current thumbnail."""
url = self.urls.home_url
response = _request(url, headers=self.header,
response = _request(self.blink, url=url, headers=self.header,
reqtype='get')['devices']
for element in response:
try:
@@ -137,7 +148,7 @@ class BlinkCamera(object):
def image_to_file(self, path):
"""Write image to file."""
thumb = self.image_refresh()
response = _request(thumb, headers=self.header,
response = _request(self.blink, url=thumb, headers=self.header,
reqtype='get', stream=True, json_resp=False)
if response.status_code == 200:
with open(path, 'wb') as imgfile:
@@ -183,7 +194,7 @@ class Blink(object):
"""Get all events on server."""
url = self.urls.event_url + self.network_id
headers = self._auth_header
self._events = _request(url, headers=headers,
self._events = _request(self, url=url, headers=headers,
reqtype='get')['event']
return self._events
@@ -192,7 +203,7 @@ class Blink(object):
"""Return boolean system online status."""
url = self.urls.network_url + self.network_id + '/syncmodules'
headers = self._auth_header
return ONLINE[_request(url, headers=headers,
return ONLINE[_request(self, url=url, headers=headers,
reqtype='get')['syncmodule']['status']]
def last_motion(self):
@@ -224,7 +235,7 @@ class Blink(object):
else:
value_to_append = 'disarm'
url = self.urls.network_url + self.network_id + '/' + value_to_append
_request(url, headers=self._auth_header, reqtype='post')
_request(self, url=url, headers=self._auth_header, reqtype='post')
def refresh(self):
"""Get all blink cameras and pulls their most recent status."""
@@ -248,7 +259,7 @@ class Blink(object):
if self._auth_header is None:
raise BlinkException(ERROR.AUTH_TOKEN)
return _request(url, headers=headers, reqtype='get')
return _request(self, url=url, headers=headers, reqtype='get')
def get_cameras(self):
"""Find and creates cameras."""
@@ -258,7 +269,7 @@ class Blink(object):
element['device_type'] == 'camera'):
# Add region to config
element['region_id'] = self.region_id
device = BlinkCamera(element, self.urls)
device = BlinkCamera(element, self)
self.cameras[device.name] = device
self._idlookup[device.id] = device.name
@@ -306,13 +317,13 @@ class Blink(object):
"password": self._password,
"client_specifier": "iPhone 9.2 | 2.2 | 222"
})
response = _request(LOGIN_URL, headers=headers,
response = _request(self, url=LOGIN_URL, headers=headers,
data=data, json_resp=False, reqtype='post')
if response.status_code is 200:
response = response.json()
(self.region_id, self.region), = response['region'].items()
else:
response = _request(LOGIN_BACKUP_URL, headers=headers,
response = _request(self, url=LOGIN_BACKUP_URL, headers=headers,
data=data, reqtype='post')
self.region_id = 'rest.piri'
self.region = "UNKNOWN"
@@ -325,6 +336,8 @@ class Blink(object):
self.urls = BlinkURLHandler(self.region_id)
return self._auth_header
def get_ids(self):
"""Set the network ID and Account ID."""
url = self.urls.networks_url
@@ -333,6 +346,6 @@ class Blink(object):
if self._auth_header is None:
raise BlinkException(ERROR.AUTH_TOKEN)
response = _request(url, headers=headers, reqtype='get')
response = _request(self, url=url, headers=headers, reqtype='get')
self.network_id = str(response['networks'][0]['id'])
self.account_id = str(response['networks'][0]['account_id'])
+1 -1
View File
@@ -6,7 +6,7 @@ import os
MAJOR_VERSION = 0
MINOR_VERSION = 6
PATCH_VERSION = '0.dev0'
PATCH_VERSION = '0.dev1'
__version__ = '{}.{}.{}'.format(MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION)