/ / Django Social Auth Pipeline - Vérification des courriels en double

Django Social Auth Pipeline - Recherche des courriels en double - Python, Django, Python-Social-Auth, Django-SocialAuth

Donc, je suis ferré sur ce post ici:

Python Social Auth dupliquant des courriers électroniques pour différents utilisateurs

Voici mon problème:

Je donne à un utilisateur la possibilité de s'inscrire, soit par courrier électronique, via Facebook ou Twitter.

J'utilise aussi le même paquet Application sociale Django Auth pour les pages de connexion de l'utilisateur.

J'ai réalisé qu'un utilisateur pouvait essayer de s'inscrire avec unCompte Facebook (associé à un email) puis réessayez ultérieurement pour vous inscrire à Twitter (qui pourrait avoir la même adresse email). Sur la base du message susmentionné, j'ai ajouté une fonction permettant de vérifier les courriels en double, comme ceci:

def check_email_exists(request, 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()

success_message = messages.success(request, "Sorry User With That Email Already Exists")

# 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:
return HttpResponseRedirect(reverse("accounts:sign_up", success_message))

et mon pipeline avec la fonction:

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",
"dealmazing.utils.check_email_exists",
"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",
)

À l'essai - si je m'inscris avec le compte Twitter d'une adresse électronique déjà enregistrée - cela fonctionne. YAY!

MAIS le problème principal vient lorsque je vais essayer de me connecter via Facebook ou Twitter. La fonction vérifie également ces connexions et me crache l'erreur "Email Allready Exists ..".

Donc, d’une certaine manière, j’ai besoin de déchiffrer entre un identifiant et un enregistrement, mais j’ai du mal à trouver comment je fais cela avec le paquet d’authentification sociale.

Des idées?

Réponses:

0 pour la réponse № 1

La différence entre login et register dépend de votre projet. Dans votre scénario, un utilisateur qui atterrit dans votre fonction de pipeline et qui correspond à un courrier électronique dans votre base de données doit être considéré comme un utilisateur. login tentative et pas un nouveau singup. C’est essentiellement la fonctionnalité de associate_by_email méthode.

Vous pourriez voir le risque potentiel en cela quand unl’utilisateur utilise un service qui ne "valide pas les adresses e-mail, il peut prendre le contrôle de tout autre compte. Vous pouvez atténuer cela en effectuant la validation de votre compte après l’ajout de tout nouveau compte social ou en faisant confiance aux services connus pour valider les e-mails à leurs extrémités.