Авторизовать клиента с моделью, отличной от User - PullRequest
0 голосов
/ 19 апреля 2020

В DRF Вы можете создавать собственные классы и схемы аутентификации. Но в конце все они должны вернуть кортеж (user, auth). У меня есть особый случай, когда мои конечные точки будут вызываться несколькими серверами, и каждый из них имеет свой уникальный секрет, хранящийся в модели и таблице Server в моем приложении.

Как я могу реализовать аутентификацию из этих серверов, в то время как авторизованная сущность не является Пользователем, но является какой-то другой моделью?

Это мой текущий код (не тестировался):

from rest_framework import authentication
from rest_framework import exceptions

from .models import Server


class ServerAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):
        server_name = request.META.get('X_Server')
        server_secret = request.META.get('Authorization')
        if not server_name or not server_secret:
            return None

        try:
            server = Server.objects.get(name=server_name, secret=server_secret)
        except Server.DoesNotExist:
            raise exceptions.AuthenticationFailed('No such server')

        return server, None

1 Ответ

0 голосов
/ 19 апреля 2020

Я исправил свою проблему с помощью параметра auth, чтобы вернуть мой сервер и вернуть анонимного пользователя в качестве пользователя.

from django.contrib.auth.models import AnonymousUser
from django.core.exceptions import ValidationError
from rest_framework import authentication
from rest_framework import exceptions

class ServerAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):
        server_name = request.META.get('HTTP_X_SERVER')
        server_secret = request.META.get('HTTP_AUTHORIZATION')
        if not server_name or not server_secret:
            raise exceptions.AuthenticationFailed('Server authentication is mandatory')

        try:
            server = Server.objects.get(name=server_name, secret=server_secret)
        except (Server.DoesNotExist, ValidationError):
            raise exceptions.AuthenticationFailed('No such server')

        return AnonymousUser, server

...