Множественные серверы аутентификации настроены и поэтому должны предоставлять аргумент "backend" или устанавливать атрибут "backend" для пользователя

Во-первых, я новичок в Django/Python.

я пытаюсь создать веб-сайт для входа, который позволяет пользователю зарегистрировать учетную запись и проверить по электронной почте или напрямую войти через FB или Google (Oauth)

Я получаю сообщение об ошибке, когда нажимаю на URL-адрес подтверждения, отправленный на электронную почту.

ошибка:

ValueError at /activate/Mjk/4p1-dcc5f7ed2e7c847fe362/

You have multiple authentication backends configured and therefore must 

provide the 'backend' argument or set the 'backend' attribute on the user.

Request Method: GET

Request URL:    http://127.0.0.1:8000/activate/Mjk/4p1-dcc5f7ed2e7c847fe362/
Django Version: 1.11.3

Exception Type: ValueError

Exception Value:    

You have multiple authentication backends configured and therefore must provide the 'backend' argument or set the 'backend' attribute on the user.
Exception Location: /usr/local/lib/python2.7/dist-packages/django/contrib/auth/__init__.py in login, line 149
Python Executable:  /usr/bin/python
Python Version: 2.7.12
Python Path:    
['/home/gaby/django projects/simple-signup-master/profile-model',
 '/usr/local/lib/python2.7/dist-packages/virtualenv-15.1.0-py2.7.egg',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/home/gaby/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Server time:    Wed, 30 Aug 2017 12:34:31 +0000

MySITE/настройки

AUTHENTICATION_BACKENDS = (

 'social_core.backends.facebook.FacebookOAuth2',
 'social_core.backends.google.GoogleOAuth2',

 'django.contrib.auth.backends.ModelBackend',

)

эта функция вызывается при получении ошибки

    def activate(request, uidb64, token):
    try:
    uid = force_text(urlsafe_base64_decode(uidb64))
    user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
    user = None

    if user is not None and account_activation_token.check_token(user, 
    token):
    user.is_active = True
    user.profile.email_confirmed = True
    user.save()
    login(request, user)
    return redirect('home')
else:
    return render(request, 'account_activation_invalid.html')

я начал получать сообщение об ошибке после добавления логина присяги через fb, google. если я удалю 'social_core.backends.facebook.FacebookOAuth2', 'social_core.backends.google.GoogleOAuth2' из AUTHENTICATION_BACKENDS, подтверждение по электронной почте снова будет работать.

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

Вот

Ответ 1

Я нашел решение. Мне пришлось добавить бэкэнд в функцию.

def activate(request, uidb64, token, backend='django.contrib.auth.backends.ModelBackend'):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None

    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.profile.email_confirmed = True
        user.save()
        login(request, user, backend='django.contrib.auth.backends.ModelBackend')
        return redirect('home')
    else:
        return render(request, 'account_activation_invalid.html')

Ответ 2

Так что в моем случае я просто не зарегистрировал пользователя. Также сделал login(request, user, backend='django.contrib.auth.backends.ModelBackend')

Чтобы зарегистрировать пользователя:

# register.py
from django.contrib.auth.models import User
cfg_user = 'user'
user = User.objects.create_user(username=cfg_user,
                                 email='[email protected]',
                                 password='password')
print('registered user '+cfg_user)

# register.sh
python manage.py shell < register.py

Ответ 3

Если вы используете сборку в django классе PasswordResetConfirmView, то вы можете исправить это, добавив:

post_reset_login_backend = "django.contrib.auth.backends.RemoteUserBackend"

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

from django.contrib.auth import views

class PasswordResetConfirmView(views.PasswordResetConfirmView):
    template_name = "reset_confirm.html"
    success_url = "/"
    post_reset_login = True
    post_reset_login_backend = "django.contrib.auth.backends.RemoteUserBackend"

Ответ 4

В моем случае простое назначение некоторого внутреннего класса из конфигурации Django пользователю работает правильно:

setattr(user, 'backend', 'django.contrib.auth.backends.RemoteUserBackend')

и тогда вы можете аутентифицировать своего пользователя

Ответ 5

Это все неудовлетворительные решения. Это действительно единственный способ сделать это сейчас?