2015-09-29 3 views
8

http://www.django-rest-framework.org/api-guide/authentication/#custom-authenticationДжанго Rest Framework пользовательские аутентификации

Я хочу использовать пользовательскую проверку подлинности в моем Джанго приложение, но не могу найти, как применить это. кто-нибудь может помочь мне с этим. пример ясен для меня в документации, но они не упомянули, где создать этот новый класс и как его использовать.

Заранее благодарен!

ответ

0

В папке, содержащей ваши файлы api, создайте другой файл, чтобы сохранить свой собственный класс аутентификации, например authentication.py. Затем в ваших настройках под DEFAULT_AUTHENTICATION_CLASSES укажите свой собственный класс проверки подлинности.

8

Как реализовать пользовательскую схему аутентификации в 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 

    ... 
+0

Пожалуйста, вы можете привести пример о том, как использовать это с помощью завиток? – momokjaaaaa

+1

@momokjaaaaa Проверьте эту ссылку SO для отправки заголовков в запросе POST. http://stackoverflow.com/questions/356705/how-to-send-a-header-using-a-http-request-through-a-curl-call –

3

Bellow - это простой пример, который может использоваться для достижения пользовательской аутентификации. В примере для доступа к конечной точке вы должны передать пароль пользователя & на данные POST.

urls.py

urlpatterns = [ 
    url(r'^stuff/', views.MyView.as_view()), 
    ... 
] 

просмотров.ру

from django.contrib.auth.models import User 
    from rest_framework import viewsets 
    from rest_framework.response import Response 
    from rest_framework.views import APIView  
    from rest_framework.permissions import IsAuthenticated 
    from rest_framework import exceptions 
    from rest_framework import authentication 
    from django.contrib.auth import authenticate, get_user_model 
    from rest_framework.authentication import BasicAuthentication, 
SessionAuthentication 


class ExampleAuthentication(authentication.BaseAuthentication): 

    def authenticate(self, request): 

     # Get the username and password 
     username = request.data.get('username', None) 
     password = request.data.get('password', None) 

     if not username or not password: 
      raise exceptions.AuthenticationFailed(_('No credentials provided.')) 

     credentials = { 
      get_user_model().USERNAME_FIELD: username, 
      'password': password 
     } 

     user = authenticate(**credentials) 

     if user is None: 
      raise exceptions.AuthenticationFailed(_('Invalid username/password.')) 

     if not user.is_active: 
      raise exceptions.AuthenticationFailed(_('User inactive or deleted.')) 


    return (user, None) # authentication successful 


class MyView(APIView): 
    authentication_classes = (SessionAuthentication, ExampleAuthentication,) 
    permission_classes = (IsAuthenticated,) 

    def post(self, request, format=None):  
     content = { 
      'user': unicode(request.user), 
      'auth': unicode(request.auth), # None 
     } 
     return Response(content) 

Curl

curl -v -X POST http://localhost:8000/stuff/ -d 'username=my_username&password=my_password'