tutorial - Facebook de django allauth redirige al registro cuando el correo electrónico recuperado coincide con el correo electrónico de un usuario existente.
django allauth twitter (1)
Puedo iniciar sesión con éxito a través de Google y Facebook usando Django (1.6.4) y allauth (0.16.1) y Python (2.7) con el redireccionamiento esperado a la configuración. proveedor. Sin embargo, cuando ya existe un usuario con el mismo correo electrónico que el que se recuperó del proveedor (fb o goolge), siempre redirige a / accounts / social / signup / # = página de registro preguntando:
Está a punto de usar su cuenta de Facebook / Google para iniciar sesión en example.com. Como paso final, complete el siguiente formulario: El correo electrónico se completa automáticamente.
He probado con SOCIALACCOUNT_AUTO_SIGNUP = True
o False
, pero ningún efecto. Intenté cambiar auth_type por facebook, pero no veo ninguna otra opción que no sea "rerequest"
Tengo los siguientes settings.py:
ACCOUNT_AUTHENTICATION_METHOD = "email" # Defaults to username_email
ACCOUNT_USERNAME_REQUIRED = False # Defaults to True
ACCOUNT_EMAIL_REQUIRED = True # Defaults to False
SOCIALACCOUNT_QUERY_EMAIL = ACCOUNT_EMAIL_REQUIRED
SOCIALACCOUNT_AUTO_SIGNUP = True
SOCIALACCOUNT_EMAIL_REQUIRED = False
ACCOUNT_ADAPTER = "myproject.adapter.MyLoginAccountAdapter"
LOGIN_URL = "/"
LOGIN_REDIRECT_URL = "/users/{id}/mytags"
¿Cómo puedo detener este redireccionamiento al registro y hacer que el inicio de sesión del proveedor redirija a LOGIN_REDIRECT_URL en el caso de un usuario ya existente con el mismo correo electrónico?
NOTA: Esto lo he intentado.
- Ya he actualizado get_login_redirect_url en myproject.adapter.MyLoginAccountAdapter. Solo funciona para google, pero no para facebook según lo reclamado por Django allauth - configurar redirección de facebook
- He intentado " omitir el formulario de registro utilizando allauth " pero no funciona
ACTUALIZACIONES:
- Gracias a esta answer , me di cuenta de que el inicio de sesión a través de Facebook se redirigirá a la página de registro en un caso: cuando el correo electrónico recuperado del perfil de Facebook coincida con el correo electrónico ya existente del usuario.
- He actualizado la pregunta para dar cuenta del caso anterior.
- Para resumir el problema, este es un caso en el que varias cuentas de proveedores tienen la misma ID de correo electrónico y django-allauth no permite un inicio de sesión intercambiable (ei, si me registré una vez usando Facebook, django-allauth me requerirá usar solo Facebook y no Google cualquier otro proveedor con la misma id de correo electrónico)
- Lo he resuelto utilizando
@receiver(pre_social_login)
y@receiver(pre_social_login)
raise ImmediateHttpResponse
(mira mi respuesta) con enlaces útiles: this and thisone
Gracias amit
Lo resolví después de profundizar en Google y en el código fuente de django y django-allauth
Problema que se está resolviendo: solo quiero la posibilidad de iniciar sesión de manera intercambiable utilizando facebook y google con la misma identificación de correo electrónico y siempre redirigir a LOGIN_REDIRECT_URL después de iniciar sesión correctamente, pero django-allauth no me permite hacerlo. En cambio, me presenta una página de registro que no quiero.
Solución: use @receiver(pre_social_login)
para llamar a una función link_to_local_user()
que inicia sesión primero y luego genera ImmediateHttpResponse que a su vez redirige a LOGIN_REDIRECT_URL
#! myproject.adapter.py
from allauth.account.adapter import DefaultAccountAdapter
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from allauth.exceptions import ImmediateHttpResponse
from allauth.socialaccount.signals import pre_social_login
from allauth.account.utils import perform_login
from allauth.utils import get_user_model
from django.http import HttpResponse
from django.dispatch import receiver
from django.shortcuts import redirect
from django.conf import settings
import json
class MyLoginAccountAdapter(DefaultAccountAdapter):
''''''
Overrides allauth.account.adapter.DefaultAccountAdapter.ajax_response to avoid changing
the HTTP status_code to 400
''''''
def get_login_redirect_url(self, request):
"""
"""
if request.user.is_authenticated():
return settings.LOGIN_REDIRECT_URL.format(
id=request.user.id)
else:
return "/"
class MySocialAccountAdapter(DefaultSocialAccountAdapter):
''''''
Overrides allauth.socialaccount.adapter.DefaultSocialAccountAdapter.pre_social_login to
perform some actions right after successful login
''''''
def pre_social_login(self, request, sociallogin):
pass # TODOFuture: To perform some actions right after successful login
@receiver(pre_social_login)
def link_to_local_user(sender, request, sociallogin, **kwargs):
'''''' Login and redirect
This is done in order to tackle the situation where user''s email retrieved
from one provider is different from already existing email in the database
(e.g facebook and google both use same email-id). Specifically, this is done to
tackle following issues:
* https://github.com/pennersr/django-allauth/issues/215
''''''
email_address = sociallogin.account.extra_data[''email'']
User = get_user_model()
users = User.objects.filter(email=email_address)
if users:
# allauth.account.app_settings.EmailVerificationMethod
perform_login(request, users[0], email_verification=''optional'')
raise ImmediateHttpResponse(redirect(settings.LOGIN_REDIRECT_URL.format(id=request.user.id)))
#! settings.py
ACCOUNT_AUTHENTICATION_METHOD = "email" # Defaults to username_email
ACCOUNT_USERNAME_REQUIRED = False # Defaults to True
ACCOUNT_EMAIL_REQUIRED = True # Defaults to False
SOCIALACCOUNT_QUERY_EMAIL = ACCOUNT_EMAIL_REQUIRED
SOCIALACCOUNT_AUTO_SIGNUP = True
SOCIALACCOUNT_EMAIL_REQUIRED = False
ACCOUNT_ADAPTER = "myproject.adapter.MyLoginAccountAdapter"
SOCIALACCOUNT_ADAPTER = ''myproject.adapter.MySocialAccountAdapter''
LOGIN_URL = "/"
LOGIN_REDIRECT_URL = "/users/{id}/mytags"