Определите, какой класс аутентификации 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)