2016-11-16 2 views
0

Dans mon site, il est possible de se connecter à travers:Auth sociale Python duplication des e-mails pour les utilisateurs différents

  • nom d'utilisateur et mot de passe
  • e-mail et mot de passe
  • google auth 2
  • facebook

Où j'utilise l'utilisateur django intégré dans le système et python social auth.

Le problème:

Supposons que je créer le compte suivant:

Nom d'utilisateur: losimonassi e-mail: [email protected]

Puis, quand j'essaie de me connecter avec mon gmail (lorenzosimonassi @ gmail.com) python social auth crée un autre utilisateur avec le même e-mail. Ainsi, lorsque j'essaie de me connecter en utilisant mon adresse e-mail, le système d'authentification trouve deux e-mails similaires, ce qui génère une erreur. J'essaie de trouver un moyen que lorsque l'utilisateur tente de se connecter avec gmail, son e-mail est vérifié par rapport à la base de données et s'il existe déjà, le processus est arrêté avec une redirection et un message d'alerte (je pense être fait à travers le middleware).

Mais bien sûr, la vérification par rapport à la base de données ne devrait viser que les autres utilisateurs backend et les utilisateurs normaux, pour éviter de bloquer son propre login.

Je ne souhaite pas associer les comptes.

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

Répondre

0

J'ai rencontré la situation que vous décrivez. Way Je l'ai résolu: ajouter étape personnalisée à pipeline auth sociale:

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) 

Ajoutez votre appelable à la canalisation:

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 redirigera l'utilisateur à votre settings.SOCIAL_AUTH_LOGIN_ERROR_URL. Cependant, si ce n'est pas ce que vous voulez, il y a aussi une autre approche. Les vérifications Python-social-auth renvoient la valeur de n'importe quelle partie de votre pipeline. Si la valeur de retour est None, cela continue. S'il s'agit d'un dict, il mettra à jour kwargs en utilisant ce dictionnaire afin que les valeurs soient disponibles plus tard dans le pipeline. Toutefois, si la valeur de retour est HttpResponse, disons, HttpResponseRedirect, elle renvoie cette réponse à l'utilisateur. Ainsi, au lieu d'élever un AuthException, vous pouvez faire

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

Cependant, ne prenez cela avec un grain de sel: les docs ne précisent pas clairement et je l'ai fait il y a un certain temps ce, donc je pourrais se tromper.

+0

Merci! J'ai fait de petits changements cela fonctionne bien !! –

0

Vous pouvez choisir d'associer des utilisateurs par leur adresse e-mail en ajoutant une étape intégrée, mais pas active par défaut dans le pipeline. Notez que vous ne devez le faire que si vous êtes certain que le fournisseur social vérifie les adresses e-mail. Sinon, je pourrais m'inscrire à un fournisseur social en utilisant votre adresse e-mail, vous connecter à votre site et avoir accès à votre utilisateur sur votre site.

Python docs auth sociale et comment associer l'utilisateur par e-mail: https://python-social-auth-docs.readthedocs.io/en/latest/use_cases.html?highlight=associate%20user#associate-users-by-email

À partir du lien ci-dessus:

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