Как аутентифицировать пользователя с помощью Django AllAuth, используя электронную почту или имя пользователя в одном поле? - PullRequest
0 голосов
/ 25 ноября 2018

Есть ли в Django AllAuth способ с конфигурацией ACCOUNT_AUTHENTICATION_METHOD = 'username_email' для отправки текста с ввода "USERNAME OR EMAIL" и его автоматической аутентификации?Я не имею в виду логику внешнего интерфейса, просто аутентификацию AllAuth.Таким образом, он получит JSON с полями, например "username_email" : "myusername", "password" : "password" или "username_email" : "myemail@gmail.com", "password" : "password", и автоматически проверит, существует ли пользователь с ником или адресом электронной почты myusername, а его пароль - password.Во втором случае он также проверит, существует ли пользователь с ником или адресом электронной почты myemail@gmail.com, а его пароль - password.Если это так, пользователь будет аутентифицирован.Есть идеи?

1 Ответ

0 голосов
/ 25 ноября 2018

Вам необходим пользовательский сервер аутентификации doc

Примерно так:

class MyAuthenticationBackend:

    def authenticate(self, email_username=None, password=None):
        if "@" in email_username:
            try:
                user = User.objects.get(email=email_username)
            except User.DoesNotExist:
                return None
        else:
            try:
                user = User.objects.get(username=email_username)
            except User.DoesNotExist:
                return None
        if getattr(user, 'is_active', False) and user.check_password(password):
            return user
        return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

Затем в виде формы:

from django.contrib.auth import authenticate
from django.contrib.auth import login
from django.shortcuts import redirect

class LoginView(FormView):
    template_name = 'my-auth/login.html'
    form_class = LoginForm

    def form_valid(self, form):
        data = form.cleaned_data
        user = authenticate(email_username=data['email_username'], password=data['password'])
        if user is None:
            form.add_error(None, _('Wrong email/username'))
            return self.form_invalid(form)
        login(self.request, user)
        return redirect('somewhere')
...