django-allauth social account connect to existing account on login

anupsabraham picture anupsabraham · Mar 6, 2015 · Viewed 7.8k times · Source

I have a custom user model and I am using django-allauth for social registration and login. I am trying to connect existing user to new social account when a user login using a social account who already has registered using email. I found this link.

def pre_social_login(self, request, sociallogin):
    user = sociallogin.account.user
    if user.id:
        return
    try:
        customer = Customer.objects.get(email=user.email)
    except Customer.DoesNotExist:
        pass
    else:
        perform_login(request, customer, 'none')

But I'm getting an error when I try to login through social account.

RelatedObjectDoesNotExist at /accounts/facebook/login/callback/
SocialAccount has no user.

Any help will be appreciated.

Also I am aware of the security issue in this. But I still want to try this.

Answer

anupsabraham picture anupsabraham · Mar 7, 2015

I managed to get this working by changing the code for adapter a little bit.

adapter.py

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter

class MySocialAccountAdapter(DefaultSocialAccountAdapter):
    def pre_social_login(self, request, sociallogin): 
        user = sociallogin.user
        if user.id:  
            return          
        try:
            customer = Customer.objects.get(email=user.email)  # if user exists, connect the account to the existing account and login
            sociallogin.state['process'] = 'connect'                
            perform_login(request, customer, 'none')
        except Customer.DoesNotExist:
            pass

If subclassing DefaultSocialAccountAdapter, we have to specify SOCIALACCOUNT_ADAPTER = 'myapp.my_adapter.MySocialAccountAdapter' in settings.py file