src/notes/middlewares.py
author ymh <ymh.work@gmail.com>
Fri, 30 Nov 2018 10:53:15 +0100
changeset 183 f8f3af9e5c83
parent 128 34a75bd8d0b9
permissions -rw-r--r--
Change the settings to avoid using Session authentication for rest framework as it raise exceptions in case client and backend are on the same domain On the filter, adapt to take into account new version of django_filters
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
128
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
"""
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
Taken from https://gist.github.com/AndrewJHart/9bb9eaea2523cd2144cf959f48a14194
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
and https://github.com/GetBlimp/django-rest-framework-jwt/issues/45#issuecomment-255383031
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
"""
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
from django.contrib.auth.middleware import get_user
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
from django.contrib.auth.models import AnonymousUser
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
from django.utils.functional import SimpleLazyObject
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
from rest_framework import exceptions
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
def get_user_jwt(request):
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
    """
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
    Replacement for django session auth get_user & auth.get_user for
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
     JSON Web Token authentication. Inspects the token for the user_id,
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
     attempts to get that user from the DB & assigns the user on the
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
     request object. Otherwise it defaults to AnonymousUser.
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    This will work with existing decorators like LoginRequired, whereas
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    the standard restframework_jwt auth only works at the view level
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    forcing all authenticated users to appear as AnonymousUser ;)
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    Returns: instance of user object or AnonymousUser object
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    """
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    user = get_user(request)
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    if user.is_authenticated:
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
        return user
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    jwt_authentication = JSONWebTokenAuthentication()
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    if jwt_authentication.get_jwt_value(request):
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
        try:
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
            user, _ = jwt_authentication.authenticate(request)
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        except exceptions.AuthenticationFailed:
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
            user = None
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    return user or AnonymousUser()
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
class JWTAuthenticationMiddleware(object):
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    def __init__(self, get_response):
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
        self.get_response = get_response
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        # One-time configuration and initialization.
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    def __call__(self, request):
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        request.user = SimpleLazyObject(lambda: get_user_jwt(request))
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        return self.get_response(request)