Of the several libraries/packages available for setting up social network logins for Django projects, I currently find django-allauth the most complete, with the best docs and the most active development. Doesn’t hurt that the lead dev on the project is super friendly and responsive on StackOverflow!
But not everything about it is intuitive. After wiring up Twitter, Facebook and Google as login providers, I found that first and last names were not being retrieved from the remote services when an account was successfully created. I also, frustratingly, could find only the most oblique references online to how to accomplish this.
There are a couple of ways to go about it – you can either receive and handle the
allauth.account.signals.user_signed_up signal that allauth emits on success, or set up
allauth.socialaccount.adapter.DefaultSocialAccountAdapter, which is also unfortunately barely documented.
I decided to go the signals route. The key to making this work is in intercepting the
sociallogin parameter your signal handler will receive when an account is successfully created. I then installed a breakpoint with
import pdb; pdb.set_trace() to inspect the contents of
sociallogin. Once I had access to those goodies, I was able to post-populate the corresponding User objects in the database.
This sample code grabs First/Last names from Twitter, Facebook or Google; season to taste:
# When account is created via social, fire django-allauth signal to populate Django User record. from allauth.account.signals import user_signed_up from django.dispatch import receiver @receiver(user_signed_up) def user_signed_up_(request, user, sociallogin, **kwargs): ''' When a social account is created successfully and this signal is received, django-allauth passes in the sociallogin param, giving access to metadata on the remote account, e.g.: sociallogin.account.provider # e.g. 'twitter' sociallogin.account.get_avatar_url() sociallogin.account.get_profile_url() sociallogin.account.extra_data['screen_name'] See the socialaccount_socialaccount table for more in the 'extra_data' field. ''' # Extract first / last names, avatar from social nets and store on User record if sociallogin.account.provider == 'twitter': name = sociallogin.account.extra_data['name'] user.first_name = name.split() user.last_name = name.split() if sociallogin.account.provider == 'facebook': user.first_name = sociallogin.account.extra_data['first_name'] user.last_name = sociallogin.account.extra_data['last_name'] if sociallogin.account.provider == 'google': user.first_name = sociallogin.account.extra_data['given_name'] user.last_name = sociallogin.account.extra_data['family_name'] user.save()