Итак, начнем со способа управления вашими токенами. Вот базовая c модель:
class Token(models.Model):
code = models.CharField(max_length=255)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
expires = models.DateTimeField()
Для проверки действительности токенов может быть создан пользовательский сервер аутентификации:
class TokenAuthenticationBackend(ModelBackend):
def authenticate(self, request, token=None):
try:
token = Token.objects.get(code=token, expires__gte=now())
except Token.DoesNotExist:
return None
else:
return token.user
Если вы используете представления на основе классов , вы можете написать миксин, который проверяет наличие токена, а затем выполняет ваш лог аутентификации c:
class UrlTokenAuthenticationMixin:
def dispatch(self, request, *args, **kwargs):
if 'token' in request.GET:
user = authenticate(request, request.GET['token'])
if user:
login(request, user)
return super(UrlTokenAuthenticationMixin, self).dispatch(request, *args, **kwargs)
Чтобы использовать это в данном представлении, просто объявите свои представления следующим образом:
class MyView(UrlTokenAuthenticationMixin, TemplateView):
# view code here
Например.
Альтернативный способ реализовать это в качестве универсального комплексного решения - использовать промежуточное программное обеспечение, а не миксин:
class TokenAuthMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if 'token' in request.GET:
user = authenticate(request, request.GET['token'])
if user:
login(request, user)
return self.get_response(request)