def _create_or_update_facebook_user(profile, access_token, expires): """Creates or updates a facebook user profile in local database. """ user_is_created = False try: fb_user = FacebookUser.objects.get(fb_id=profile['id']) except FacebookUser.DoesNotExist: user = User.objects.create( \ first_name=profile['first_name'], last_name=profile['last_name'], username='******' + profile['id'] ) user_is_created = True if user_is_created: fb_user = FacebookUser() fb_user.fb_id = profile['id'] fb_user.user = user else: fb_user.user.first_name = profile['first_name'] fb_user.last_name = profile['last_name'] fb_user.fb_username = profile['username'] fb_user.access_token = access_token fb_user.expiry_at = datetime.datetime.now() + \ datetime.timedelta(seconds=int(expires)) fb_user.save() return fb_user
def authenticate(self, token=None, request=None): args = { 'client_id': settings.FACEBOOK_APP_ID, 'client_secret': settings.FACEBOOK_APP_SECRET, 'redirect_uri': request.build_absolute_uri(reverse('facebook.views.authenticate_view')), 'code': 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] profile_json = urllib.urlopen('https://graph.facebook.com/me?' + urllib.urlencode(dict(access_token=access_token))) fb_profile = simplejson.load(profile_json) try: fb_user = FacebookUser.objects.get(facebook_id=str(fb_profile['id'])) except FacebookUser.DoesNotExist: fb_user = FacebookUser(facebook_id=str(fb_profile['id'])) fb_user.access_token = access_token fb_user.profile_json = str(profile_json) if not fb_user.user_id: try: fb_user.user = User.objects.get(username='******' % fb_user.facebook_id,) except User.DoesNotExist: fb_user.user, created = User.objects.get_or_create( username='******' % fb_user.facebook_id, first_name=fb_profile['first_name'], last_name=fb_profile['last_name'], email=fb_profile['email'], ) fb_user.save() return fb_user.user