Определите, какой класс аутентификации DRF успешно прошел аутентификацию первым

Допустим, у меня есть следующий порядок классов аутентификации Django Rest Framework:

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework.authentication.TokenAuthentication",
        "rest_framework.authentication.SessionAuthentication",
        "MyCustomAuthClass",
    ],
    ...
}

Согласно документам:

REST framework попытается аутентифицироваться с каждым классом в списке, и установит request.user и request.auth, используя возвращаемое значение первого класса, который успешно аутентифицируется.

В моем представлении я хочу знать, какой класс успешно прошел аутентификацию.

Мой случай использования заключается в том, что я хочу обрабатывать третий класс auth по-разному для определенной конечной точки. В настоящее время я повторно прохожу аутентификацию, что кажется ненужным и неэффективным:

def get(self, request):
    if (
        not TokenAuthentication().authenticate()
        and not SessionAuthentication().authenticate()
        and MyCustomAuthClass().authenticate(request):
        # do this
    else:
        # do something else

Есть ли способ сделать это или мой подход является лучшим вариантом?

Вы можете аннотировать пользователя, возвращаемого вашим классом аутентификации, следующим образом:

class MyCustomAuthClass(BaseAuthentication):
    def authenticate(self, request):
        # get your user for example by token:
        user = User.objects.get(token=request.META.get("HTTP_AUTHORIZATION"))
        user.is_authenticated_on_my_custom_class = True
        return (user, token)

Тогда, по вашему мнению, вы можете сделать:

if hasattr(request.user, "is_authenticated_on_my_custom_class") and request.user.is_authenticated_on_my_custom_class:
    # do something for `MyCustomAuthClass`
isinstance(request.successful_authenticator, MyCustomAuthClass)
Вернуться на верх