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] user_json = urllib.urlopen('https://graph.facebook.com/me?' + urllib.urlencode(dict(access_token=access_token))) fb_profile = simplejson.load(user_json) try: fb_user = FacebookUser.objects.get(facebook_id=str(fb_profile['id'])) except FacebookUser.DoesNotExist: if request.user.is_authenticated(): fb_user = FacebookUser(user=request.user, facebook_id=fb_profile['id']) else: request.session['fb_profile'] = fb_profile return None fb_user.access_token = access_token fb_user.save() return fb_user.user
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 register_view(request): try: fb_profile = request.session['fb_profile'] except KeyError: return HttpResponseRedirect('/') if request.method == 'POST': user = User.objects.create_user(request.POST['username'], request.POST['email']) fb_user = FacebookUser(user=user, facebook_id=fb_profile['id']) fb_user.save() del request.session['fb_profile'] return HttpResponseRedirect(reverse('facebook.views.authenticate_view') + '?ignorereferer=1') else: return render_to_response('member/register-facebook.html', context_instance=RequestContext(request))
def connect(request, redirect_field_name=REDIRECT_FIELD_NAME, app_name=None): """ Connects the Facebook Account to the current logged-in user. """ fb_app = get_app_dict(app_name) graph = get_graph(request, app_name=app_name) redirect_to = request.REQUEST.get(redirect_field_name, fb_app['REDIRECT-URL']) if request.user.is_authenticated(): try: me = graph.get_object("me") except facebook.GraphAPIError as e: return redirect('fb_login') # if the user has already a facebook connection, abort and show # error message if hasattr(request.user, 'user'): logger.debug('The logged in user is already connected.') # check if the django user and FB user match: if graph.user_id <> request.user.user.id: logger.debug( 'User %s already connected with Facebook account %s' % (request.user.get_full_name, request.user.user._name)) auth_views.logout(request, next_page=reverse('fb_app')) # Otherwise redirect return redirect(redirect_to) else: # The User has no Facebook account attached. Connect him. try: # if that facebook user already exists, abort and show error message fb_user = FacebookUser.objects.get(id=graph.user_id) except FacebookUser.DoesNotExist: fb_user = FacebookUser(id=graph.user_id) fb_user.get_from_facebook(graph=graph, save=True) else: if isinstance(fb_user.user, User): auth_views.logout(request, next_page=reverse('fb_login')) else: fb_user.user = request.user fb_user.save() finally: return redirect(redirect_to) else: # The user is not logged in # -> redirect to login page return redirect('fb_login')
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
def authenticate(self, graph=None): if not graph: raise AttributeError, 'Authentication Backend needs a valid graph.' # check if the access token is valid: try: me = graph.request('me') except facebook.GraphAPIError as e: logger.debug('Could not authenticate User: %s ' % e) return None try: facebook_user = FacebookUser.objects.get(id=int(me['id'])) except FacebookUser.DoesNotExist: facebook_user = FacebookUser(id=int(me['id'])) facebook_user.get_from_facebook(graph=graph, save=True) else: try: if isinstance(facebook_user.user, User) and facebook_user.user.is_authenticated(): return facebook_user.user except User.DoesNotExist: pass #we use the Facebook id as username because 'me.name' is not unique enough. user = get_or_create_user( me['id'], { 'email': me.get('email', u''), 'first_name': me.get('first_name', u''), 'last_name': me.get('last_name', u''), 'password': UNUSABLE_PASSWORD, 'date_joined': datetime.now() }) facebook_user.user = user facebook_user.save() return user
def create_generic(response): try: fb_api_user_obj = FacebookUser.objects.get(user_id = response['id']) if fb_api_user_obj.person: fb_api_user_obj.access_token = response['access_token'] response = { 'new_user' : 'false','user_id':response['id']} fb_api_user_obj.save() else: if fb_api_user_obj.username: username = fb_api_user_obj.username else: username = response['first_name'] + response['last_name'] response = { 'new_user' : True , 'username' : username, 'email' : fb_api_user_obj.email, 'location' : fb_api_user_obj.location, 'user_id' : fb_api_user_obj.user_id } except: user = FacebookUser(user_id = response['id']) # create a account try: user.name = response['name'] except: pass try: username = response['username'] user.username = username except: try: username = response['first_name'] + response['last_name'] except: pass try: user.first_name = response['first_name'] except: pass try: user.middle_name = response['middle_name'] except: pass try: user.last_name = response['last_name'] except: user.link = response['link'] try: user.verified = response['verified'] except: pass try: user.email= response['email'] except: pass try: sex = response['gender'] if sex == 'male': user.gender = 'M' elif sex == 'female': user.gender = 'F' except: pass try: birthday_in_datetime = datetime.strptime(response['birthday'], '%m/%d/%Y') birthday_as_string = birthday_in_datetime.strftime('%Y-%m-%d') user.birthday = datetime.strptime(birthday_as_string, '%Y-%m-%d').date() except: pass try: user.location = response['location'] except: pass user.access_token = response['access_token'] user.save() #registration_form = get_account('form', type="registration", username = username) #HTML = render_to_string("fb_api/forms/register.html", {'form': registration_form, 'user_id' : user.user_id}, context_instance = RequestContext(request)) response = { 'new_user' : 'true' , 'username' : username, 'email' : response['email'], 'location' : user.location, 'user_id' : response['id'] } return response