Как реализовать пользовательскую схему аутентификации в DRF?
Для реализации пользовательской схемы аутентификации нам необходимо подклассифицировать класс BaseAuthentication
DRF и переопределить метод .authenticate(self, request)
.
Метод должен возвращать двухточечный код (user, auth)
, если аутентификация выполнена успешно, или None
в противном случае. В некоторых случаях мы можем создать исключение AuthenticationFailed
из метода .authenticate()
.
Пример (из DRF docs):
Допустим, мы хотим проверить подлинность любого входящего запроса в качестве пользователя, указанного в username
в пользовательском заголовке запроса с именем 'X_USERNAME'
.
Шаг 1: Создание класса аутентификации пользовательского
Чтобы сделать это, мы создадим authentication.py
файл в my_app
.
# my_app/authentication.py
from django.contrib.auth.models import User
from rest_framework import authentication
from rest_framework import exceptions
class ExampleAuthentication(authentication.BaseAuthentication):
def authenticate(self, request):
username = request.META.get('X_USERNAME') # get the username request header
if not username: # no username passed in request headers
return None # authentication did not succeed
try:
user = User.objects.get(username=username) # get the user
except User.DoesNotExist:
raise exceptions.AuthenticationFailed('No such user') # raise exception if user does not exist
return (user, None) # authentication successful
Шаг 2: Укажите пользовательский класс аутентификации
После создания пользовательского класса аутентификации, мы должны определить этот класс аутентификации в наших настройках DRF. При этом все запросы будут аутентифицированы на основе этой схемы аутентификации.
'DEFAULT_AUTHENTICATION_CLASSES': (
'my_app.authentication.ExampleAuthentication', # custom authentication class
...
),
Примечание: Если вы хотите использовать этот пользовательский класс проверки подлинности на за просмотр основы или за основу режима просмотра, а не на глобальном уровне, вы можете определить этот класс аутентификации явно в своих взглядах.
class MyView(APIView):
authentication_classes = (ExampleAuthentication,) # specify this authentication class in your view
...
Пожалуйста, вы можете привести пример о том, как использовать это с помощью завиток? – momokjaaaaa
@momokjaaaaa Проверьте эту ссылку SO для отправки заголовков в запросе POST. http://stackoverflow.com/questions/356705/how-to-send-a-header-using-a-http-request-through-a-curl-call –