Source code for boxsdk.auth.redis_managed_oauth2
# coding: utf-8
from __future__ import unicode_literals
from uuid import uuid4
from redis import StrictRedis
from redis.lock import Lock
from .oauth2 import OAuth2
[docs]class RedisManagedOAuth2Mixin(OAuth2):
"""
Box SDK OAuth2 subclass.
Allows for storing auth tokens in redis.
"""
def __init__(self, unique_id=uuid4(), redis_server=None, *args, **kwargs):
"""
:param unique_id:
An identifier for this auth object. Auth instances which wish to share tokens must use the same ID.
:type unique_id:
`unicode`
:param redis_server:
An instance of a Redis server, configured to talk to Redis.
:type redis_server:
:class:`Redis`
"""
# pylint:disable=keyword-arg-before-vararg
self._unique_id = unique_id
self._redis_server = redis_server or StrictRedis()
refresh_lock = Lock(redis=self._redis_server, name='{0}_lock'.format(self._unique_id))
super(RedisManagedOAuth2Mixin, self).__init__(*args, refresh_lock=refresh_lock, **kwargs)
if self._access_token is None:
self._get_and_update_current_tokens()
@property
def unique_id(self):
"""
Get the unique ID used by this auth instance. Other instances can share tokens with this instance
if they share the ID with this instance.
"""
return self._unique_id
def _get_tokens(self):
"""
Base class override.
Gets the latest tokens from redis before returning them.
"""
return self._redis_server.hvals(self._unique_id) or (None, None)
def _store_tokens(self, access_token, refresh_token):
"""
Base class override.
Saves the refreshed tokens in redis.
"""
super(RedisManagedOAuth2Mixin, self)._store_tokens(access_token, refresh_token)
self._redis_server.hmset(self._unique_id, {'access': access_token, 'refresh': refresh_token})
[docs]class RedisManagedOAuth2(RedisManagedOAuth2Mixin):
"""
OAuth2 subclass which uses Redis to manage tokens.
"""
pass