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. """ keystone = KeystoneBackend() self.keystone = keystone args = { 'client_id': settings.FACEBOOK_APP_ID, 'client_secret': settings.FACEBOOK_APP_SECRET, 'redirect_uri': request.build_absolute_uri( reverse('horizon.facebook.views.authentication_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) if 'access_token' not in response: messages.error( request, _("Token Expired, please login again.")) return None 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) tenant_id = None password = "" 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 password = fb_user.password tenant_id = fb_user.tenant_id fb_user.save() except FacebookProfile.DoesNotExist: # No existing user try: facebook_id = fb_profile['id'] username = "******" % facebook_id try: user = User.objects.create_user(username, fb_profile['email']) except IntegrityError: # Username already exists, make it unique existing_user = User.objects.get(username=username) existing_user.delete() user = User.objects.create_user(username, fb_profile['email']) user.save() password = "".join([random.choice( string.ascii_lowercase + string.digits) for i in range(8)]) # Create the FacebookProfile fb_user = FacebookProfile(user=user, facebook_id=fb_profile['id'], access_token=access_token, password=password) tenant_name = "facebook%s" % fb_profile['id'] if not self.keystone_user_exists(username): tenant = self.add_keystone_user(settings, tenant_name, password, fb_profile) else: tenant = self.get_keystone_tenant(settings, tenant_name) fb_user.tenant_id = tenant.id tenant_id = fb_user.tenant_id fb_user.save() except Exception, e: messages.error(request, e) fb_user.delete()