2016-11-16 1 views
0

In meiner Website ist es möglich, um sich einzuloggen durch:Python Social Auth Duplizieren von E-Mails für verschiedene Benutzer

  • Benutzername und Passwort
  • E-Mail und Passwort
  • google Auth 2
  • facebook

Wo verwende ich django Benutzer integrierte System und Python soziale Auth.

Das Problem:

Angenommen, schaffe ich das folgende Konto:

Benutzername: losimonassi E-Mail: [email protected]

Dann, wenn ich versuche mit meinem gmail anmelden (lorenzosimonassi @ gmail.com) Python Social Auth erstellt einen anderen Benutzer mit der gleichen E-Mail. Wenn ich versuche, mich mit meiner E-Mail anzumelden, findet das Authentifizierungssystem zwei ähnliche E-Mails, die einen Fehler auslösen.

Ich versuche einen Weg zu finden, dass, wenn der Benutzer versucht sich mit gmail anzumelden, seine E-Mail gegen die DB geprüft wird und wenn es bereits existiert, wird der Prozess mit einer Weiterleitung und einer Warnmeldung gestoppt (ich denke es könnte durch die Middleware gemacht werden).

Aber natürlich sollte die Überprüfung gegen die DB nur gegen andere Backends Benutzer und normale Benutzer überprüfen, um zu vermeiden, seine eigene Anmeldung zu blockieren.

Ich möchte die Konten nicht zuordnen.

settings.py

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details', 
    'social.pipeline.social_auth.social_uid', 
    'social.pipeline.social_auth.auth_allowed', 
    'social.pipeline.social_auth.social_user', 
    'social.pipeline.user.get_username', 
    'social.pipeline.user.create_user', 
    #'social.pipeline.social_auth.associate_user', 
    #'social.pipeline.social_auth.load_extra_data', 
    'social.pipeline.user.user_details' 
) 

admin image

Antwort

0

ich die Situation, die Sie beschreiben begegnet sind. Art und Weise gelöst ich es: Fügen Sie benutzerdefinierte Schritt zur sozialen Auth Pipeline:

def check_email_exists(backend, details, uid, user=None, *args, **kwargs): 
    email = details.get('email', '') 
    provider = backend.name 

    # check if social user exists to allow logging in (not sure if this is necessary) 
    social = backend.strategy.storage.user.get_social_auth(provider, uid) 
    # check if given email is in use 
    count = User.objects.filter(username=email).count() 

    # user is not logged in, social profile with given uid doesn't exist 
    # and email is in use 
    if not user and not social and count: 
     raise AuthException(backend) 

Fügen Sie Ihre aufrufbar zur Pipeline:

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details', 
    'social.pipeline.social_auth.social_uid', 
    'social.pipeline.social_auth.auth_allowed', 
    'social.pipeline.social_auth.social_user', 
    'social.pipeline.user.get_username', 
    'path.to.module.check_email_exists', # move if appropriate 
    'social.pipeline.user.create_user', 
    'social.pipeline.user.user_details' 
) 

Raising AuthException Benutzer auf Ihre settings.SOCIAL_AUTH_LOGIN_ERROR_URL umleitet. Wenn dies jedoch nicht das ist, was Sie wollen, gibt es auch einen anderen Ansatz. Python-social-auth überprüft den Rückgabewert eines beliebigen Teils Ihrer Pipeline. Wenn der Rückgabewert None ist, wird einfach fortgefahren. Wenn es ein dict ist, aktualisiert es Kwargs mit diesem Wörterbuch, damit die Werte später in der Pipeline verfügbar sind. Wenn der Rückgabewert jedoch HttpResponse ist, z. B. HttpResponseRedirect, wird diese Antwort an den Benutzer zurückgegeben. Anstatt also ein AuthException zu heben, können Sie

return HttpResponseRedirect(reverse('desired-endpoint')) 

jedoch nehmen, dass mit einem Körnchen Salz: die docs sagen, dies nicht klar und ich habe das ganz vor einiger Zeit getan, so könnte ich sich irren.

+0

Dank! Ich habe kleine Änderungen gemacht, es funktioniert gut !! –

0

Sie können Benutzer anhand ihrer E-Mail-Adressen zuordnen, indem Sie einen integrierten, aber standardmäßig nicht aktiven Schritt in der Pipeline hinzufügen. Beachten Sie, dass Sie dies nur tun sollten, wenn Sie sicher sind, dass der soziale Anbieter die E-Mail-Adressen überprüft. Andernfalls könnte ich mich mit Ihrer E-Mail-Adresse bei einem sozialen Anbieter anmelden, sich auf Ihrer Website anmelden und Zugriff auf Ihre Nutzer auf Ihrer Website haben.

Python soziale Auth docs und wie Benutzer per E-Mail assoziieren: https://python-social-auth-docs.readthedocs.io/en/latest/use_cases.html?highlight=associate%20user#associate-users-by-email

Aus dem obigen Link:

SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details', 
    'social_core.pipeline.social_auth.social_uid', 
    'social_core.pipeline.social_auth.auth_allowed', 
    'social_core.pipeline.social_auth.social_user', 
    'social_core.pipeline.user.get_username', 
    'social_core.pipeline.social_auth.associate_by_email', # <--- enable this one 
    'social_core.pipeline.user.create_user', 
    'social_core.pipeline.social_auth.associate_user', 
    'social_core.pipeline.social_auth.load_extra_data', 
    'social_core.pipeline.user.user_details', 
) 
Verwandte Themen