django-rest-auth/dj_rest_auth/utils.py

53 lines
1.8 KiB
Python
Raw Normal View History

from importlib import import_module
2020-03-22 13:41:16 +03:00
def import_callable(path_or_callable):
if hasattr(path_or_callable, '__call__'):
return path_or_callable
else:
assert isinstance(path_or_callable, str)
package, attr = path_or_callable.rsplit('.', 1)
return getattr(import_module(package), attr)
2016-01-01 00:10:52 +03:00
def default_create_token(token_model, user, serializer):
2016-01-01 00:10:52 +03:00
token, _ = token_model.objects.get_or_create(user=user)
return token
2016-03-01 14:51:01 +03:00
2020-03-20 00:09:20 +03:00
try:
from django.conf import settings
2020-03-20 00:09:20 +03:00
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
def jwt_encode(user):
TOPS = import_callable(getattr(settings, 'JWT_TOKEN_CLAIMS_SERIALIZER', TokenObtainPairSerializer))
refresh = TOPS.get_token(user)
return refresh.access_token, refresh
2020-03-20 00:09:20 +03:00
class JWTCookieAuthentication(JWTAuthentication):
"""
An authentication plugin that hopefully authenticates requests through a JSON web
2020-03-22 13:41:16 +03:00
token provided in a request cookie (and through the header as normal, with a
preference to the header).
2020-03-20 00:09:20 +03:00
"""
def authenticate(self, request):
2020-03-22 13:41:16 +03:00
cookie_name = getattr(settings, 'JWT_AUTH_COOKIE', None)
2020-03-20 00:09:20 +03:00
header = self.get_header(request)
if header is None:
2020-03-22 13:41:16 +03:00
if cookie_name:
raw_token = request.COOKIES.get(cookie_name)
2020-03-20 00:09:20 +03:00
else:
return None
else:
raw_token = self.get_raw_token(header)
2020-03-20 00:09:20 +03:00
if raw_token is None:
return None
validated_token = self.get_validated_token(raw_token)
return self.get_user(validated_token), validated_token
2020-03-22 13:41:16 +03:00
except ImportError:
raise ImportError("rest-framework-simplejwt needs to be installed")