def authenticate(self, token=None, request=None): """ Reads in a Facebook code and asks Facebook if it's valid and what user it points to. """ args = { 'client_id': settings.FACEBOOK_APP_ID, 'client_secret': settings.FACEBOOK_APP_SECRET, 'redirect_uri': request.build_absolute_uri( reverse('facebook_callback')), 'code': token, } # Get a legit access token target = urllib.urlopen( 'https://graph.facebook.com/oauth/access_token?' + urllib.urlencode(args)).read() response = cgi.parse_qs(target) access_token = response['access_token'][-1] # Read the user's profile information fb_profile = urllib.urlopen( 'https://graph.facebook.com/me?access_token=%s' % access_token) fb_profile = json.load(fb_profile) try: # Try and find existing user fb_user = UserProfile.objects.get(facebook_id=fb_profile['id']) user = fb_user.user # Update access_token fb_user.access_token = access_token fb_user.save() except UserProfile.DoesNotExist: # No existing user if getattr(settings, 'FACEBOOK_FORCE_SIGNUP', False): # No existing user, use anonymous user = AnonymousUser() user.username = username user.first_name = fb_profile['first_name'] user.last_name = fb_profile['last_name'] fb_user = UserProfile( facebook_id=fb_profile['id'], access_token=access_token ) user.facebookprofile = fb_user else: # No existing user, create one user = User.objects.create_user(fb_profile['id'], fb_profile['email']) user.first_name = fb_profile['first_name'] user.last_name = fb_profile['last_name'] # with django-primate User has one field called 'name' instead # of first_name and last_name user.name = u'%s %s' % (user.first_name, user.last_name) user.save() # Create the UserProfile fb_user = UserProfile(user=user, facebook_id=fb_profile['id'], access_token=access_token) fb_user.save() return user
def authenticate(self, token=None, request=None): """ Reads in a Facebook code and asks Facebook if it's valid and what user it points to. """ args = { 'client_id': settings.FACEBOOK_APP_ID, 'client_secret': settings.FACEBOOK_APP_SECRET, 'redirect_uri': request.build_absolute_uri(reverse('facebook-callback')), 'code': token, } # Get a legit access token target = urllib.urlopen( 'https://graph.facebook.com/oauth/access_token?' + urllib.urlencode(args)).read() response = cgi.parse_qs(target) access_token = response['access_token'][-1] # Read the user's profile information fb_profile = urllib.urlopen( 'https://graph.facebook.com/me?access_token=%s' % access_token) fb_profile = json.load(fb_profile) try: # Try and find existing user fb_user = FacebookProfile.objects.get(facebook_id=fb_profile['id']) user = fb_user.user # Update access_token fb_user.access_token = access_token fb_user.save() except FacebookProfile.DoesNotExist: # No existing user if getattr(settings, 'FACEBOOK_FORCE_SIGNUP', False): # No existing user, use anonymous user = AnonymousUser() user.username = username user.first_name = fb_profile['first_name'] user.last_name = fb_profile['last_name'] fb_user = FacebookProfile(facebook_id=fb_profile['id'], access_token=access_token) user.facebookprofile = fb_user else: # No existing user, create one user = User.objects.create_user(fb_profile['id'], fb_profile['email']) user.first_name = fb_profile['first_name'] user.last_name = fb_profile['last_name'] # Facebook allows for longer name. This fixes the inconsistencies between # Django and Postgres if len(user.first_name) > 30: user.first_name = user.first_name[:30] if len(user.last_name) > 30: user.last_name = user.last_name[:30] # with django-primate User has one field called 'name' instead # of first_name and last_name user.name = u'%s %s' % (user.first_name, user.last_name) user.save() # Create the FacebookProfile fb_user = FacebookProfile(user=user, facebook_id=fb_profile['id'], access_token=access_token) fb_user.save() return user