классы разрешений IsAuthenticated не работают в DRF - PullRequest
0 голосов
/ 08 декабря 2018

Я использовал токен-аутентификацию, и она работает нормально, т.е. она аутентифицирует пользователя, а затем пользователь входит в систему. Но в моих представлениях я установил классы разрешений для IsAuthenticated для одного из представлений, и это не так.разрешение пользователю, даже если он является аутентифицированным пользователем.Ниже приведен снимок экрана, на котором написано, что я вошел в систему (jadhav@gmail.com):

enter image description here

и на следующей следующей вкладке:говорит "детали аутентификации не предоставлены":

enter image description here

Может кто-нибудь сказать, что не так?Хорошо, я предоставляю детали: это мои настройки:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated', )
}

Вот как я аутентифицировался:

класс UserLoginAPIView (APIView):

permission_classes = [AllowAny]
serializer_class = UserLoginSerializer

def post(self, request, *args, **kwargs):
    data = request.data
    serializer = UserLoginSerializer(data=data)
    if serializer.is_valid(raise_exception=True):
        # new_data = serializer.data
        if serializer.data:
            user = authenticate(username=request.data['username'], password=request.data['password'])
            login(request, user)
            print("IsAuthenticated", user.is_authenticated)
        token, _ = Token.objects.get_or_create(user=user)
        return Response({'token': token.key},
                        status=HTTP_200_OK)

ДругойПосмотреть, где я ставлю ограничения:

class BoardCreateAPIView (CreateAPIView):

queryset = Boards.objects.all()
serializer_class = BoardCreateSerializer
permission_classes = (IsAuthenticated,)

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

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

  1. Клиент запрашивает токен с сервера, используя логин и пароль
  2. Сервер проверяет правильность ваших учетных данных, создает токен и возвращает его клиенту
  3. В последующих запросах клиент добавляет токен в заголовок Auth следующим образом:

    Authorization: Token <the_client_token>

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

Для получения дополнительной информации см. Статью @Reza по ссылке.

0 голосов
/ 08 декабря 2018

В django rest framework вы должны предоставить токен в заголовке вашего запроса.Вот пример с командой curl:

curl -X POST -H "Content-Type: application/json" -H "Authorization: Token <MY_TOKEN>" http://my-api-url

Также убедитесь, что в вашем settings.py по крайней мере есть следующие строки:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.BasicAuthentication',
    'rest_framework.authentication.SessionAuthentication',
)
}

Для большего понимания Прочитайте это Документ из Django Rest Framework

...