from django.conf import settings from django.contrib import auth from django.contrib.auth.models import AnonymousUser from django.contrib.auth import middleware from django.utils import timezone from django.utils.dateparse import parse_datetime """ We need the request object to get the user, so we'll slightly modify the existing django.contrib.auth.get_user method. To do so we update the auth middleware to point to our overridden method. Calling the "patch_middleware_get_user" method somewhere like our urls.py file takes care of hooking it in appropriately. """ def middleware_get_user(request): if not hasattr(request, '_cached_user'): request._cached_user = get_user(request) return request._cached_user def get_user(request): try: user_id = request.session[auth.SESSION_KEY] backend_path = request.session[auth.BACKEND_SESSION_KEY] backend = auth.load_backend(backend_path) backend.request = request user = backend.get_user(user_id) or AnonymousUser() except KeyError: user = AnonymousUser() return user def patch_middleware_get_user(): middleware.get_user = middleware_get_user auth.get_user = get_user """ End Monkey-Patching. """ def check_token_expiration(token): """ Timezone-aware checking of the auth token's expiration timestamp. Returns ``True`` if the token has not yet expired, otherwise ``False``. """ expiration = parse_datetime(token.expires) if settings.USE_TZ and timezone.is_naive(expiration): # Presumes that the Keystone is using UTC. expiration = timezone.make_aware(expiration, timezone.utc) # In case we get an unparseable expiration timestamp, return False # so you can't have a "forever" token just by breaking the expires param. if expiration: return expiration > timezone.now() else: return False