Автоматическая проверка подлинности DRF при поступлении запроса со страницы, на которой зарегистрирован пользователь. Запрос аутентификации токена, если запрос API сделан внешним - PullRequest
0 голосов
/ 05 января 2019

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

def login_view(request):
    if request.method == 'POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            if user.last_login is None:
                login(request, user)
                return redirect('accounts:change_password')
            else:
                login(request, user)
                return redirect('home')
    else:
        form = AuthenticationForm()

    if request.user.is_authenticated:
        return redirect('home')
    else:
        return render(request, 'login.html', {'form': form})

Я настроил базовую конечную точку API покоя, используя DRF

class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all()
    serializer_class = UserSerializer

Когда я захожу на домашнюю страницу, мне нужно войти в систему:

@login_required(login_url="/accounts/login/")
def home(request):
    return render(request, 'index.html', {})

Я хотел бы пройти аутентификацию с использованием django.contrib.auth и перенаправить на домашнюю страницу.

Когда загружается домашняя страница, я хотел бы выполнить вызов AJAX для отображения всех пользователей.

$.ajax(
    {
        type: "GET",
        url: '/accounts/users/',
        success: function(result){
                 console.log(result);
                }
    });

Этот вызов должен работать, только если я уже вошел в систему со своим пользователем.

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

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


Вопрос:

Как я могу смешать аутентификацию django.contrib.auth с аутентификацией токена Django rest_framework, как описано выше? Я хотел бы иметь веб-приложение и REST API одновременно. Выполните аутентификацию в веб-приложении, используя django.contrib.auth. Выполните аутентификацию в REST API с помощью токена. Но если пользователь уже вошел в веб-приложение, выполните запрос API Rest без необходимости повторной аутентификации. Можно ли как-то повторно использовать сеанс веб-приложения?


Уже настроил мою модель пользователя: https://docs.djangoproject.com/en/2.1/topics/auth/customizing/

Посмотрели на это, еще не начали внедрять. Я не уверен, как они могут подключиться. https://www.django -rest-framework.org / апи-гид / аутентификации / # tokenauthentication



Решение

Я принял ответ ниже, хотя тем временем нашел решение. Я предположил, что вы можете добавить только один метод аутентификации, но вы можете иметь больше. То, что я фактически закончил, было:

'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
)

Работает как шарм. В моем случае разрешение IsAuthenticated применяется глобально. В принятом ответе применяется к конечной точке

1 Ответ

0 голосов
/ 05 января 2019

Вы всегда можете использовать столько методов аутентификации, сколько захотите. DRF имеет SessionAuthentication , которая работает как собственная аутентификация Django, в дополнение к его TokenAuthentication. Все, что вам нужно сделать, это установить оба класса аутентификации либо глобально в файле настроек, либо для каждого просмотра.

Например, вы можете установить классы аутентификации для вашего UserViewSet таким образом.

from rest_framework.authentication import TokenAuthentication, SessionAuthentication


class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
authentication_classes = [TokenAuthentication, SessionAuthentication]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...