it-swarm.com.de

backends konfiguriert und muss daher das Argument 'Backend' bereitstellen oder das Attribut 'Backend' für den Benutzer festlegen

zuerst bin ich neu bei Django/Python.

ich versuche eine Login-Website zu erstellen, auf der der Benutzer ein Konto registrieren und per E-Mail bestätigen oder sich direkt über Fb oder Google anmelden kann (Oauth).

ich erhalte die Fehlermeldung, wenn ich auf die an die E-Mail gesendete Bestätigungs-URL klicke.

error:

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

meine Seite/Einstellungen

AUTHENTICATION_BACKENDS = (

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

 'Django.contrib.auth.backends.ModelBackend',

)

dies ist die Funktion, die aufgerufen wird, wenn der Fehler angezeigt wird

    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')

ich habe die Fehlermeldung erhalten, nachdem ich das Eid-Login über fb, google ..__ hinzugefügt hatte. Wenn ich 'social_core.backends.facebook.FacebookOAuth2', 'social_core.backends.google.GoogleOAuth2' von AUTHENTICATION_BACKENDS entferne, funktioniert die E-Mail-Bestätigung erneut.

ich habe online gesucht und auch hier war die einzige Lösung, die ich gefunden habe, unten, aber mein Problem wurde nicht gelöst.

Hier

10
gaby awad

In meinem Fall hatte ich den Benutzer einfach nicht registriert. Habe auch login(request, user, backend='Django.contrib.auth.backends.ModelBackend')

Benutzer registrieren:

# 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
9
citynorman

Ich habe die Lösung gefunden. Ich musste das Backend der Funktion hinzufügen.

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')
5
gaby awad

Wenn Sie die eingebaute Django class PasswordResetConfirmView verwenden, können Sie dies beheben, indem Sie Folgendes hinzufügen:

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

So ähnlich wie:

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"
1
Christoffer

In meinem Fall ist es ganz einfach, dem Benutzer einen Teil der Backend-Klasse aus der Django Konfiguration zuzuweisen:

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

und dann können Sie Ihren Benutzer authentifizieren

0
Rafał