Skip to content

Instantly share code, notes, and snippets.

@dannyroa
Last active December 11, 2015 11:58
Show Gist options
  • Save dannyroa/4596978 to your computer and use it in GitHub Desktop.
Save dannyroa/4596978 to your computer and use it in GitHub Desktop.
'code' should only be used once. Once the 'code' is used to obtain the 'access_token', store the 'access_token' to the session. Use 'access_token' if available in the session.
from django.contrib.auth.models import User
from facebookconnect.models import FacebookProfile
from django.conf import settings
from django.core.urlresolvers import reverse
import facebook
from facebookconnect.utils import facebook_login_check, get_access_token
class FacebookConnectBackend:
"""
Authenticates against django.contrib.auth.models.User.
"""
@ staticmethod
def authenticate(request):
cookie = facebook_login_check(request.COOKIES)
if cookie:
facebook_user_id = cookie["uid"]
access_token = cookie["access_token"]
elif 'access_token' in request.session:
access_token = request.session['access_token']
graph = facebook.GraphAPI(access_token)
profile = graph.get_object("me")
facebook_user_id = str(profile["id"])
elif request.GET.has_key('code'):
url = reverse('facebookconnect_authenticate')
next_url = request.GET.get('next', None)
if next_url:
url = '%s?next=%s' % (url, next_url)
access_token = get_access_token(request.GET['code'], url)
request.session['access_token'] = access_token
graph = facebook.GraphAPI(access_token)
profile = graph.get_object("me")
facebook_user_id = str(profile["id"])
else:
return None
try:
fb_profile = FacebookProfile.objects.get(facebook_id=facebook_user_id)
fb_profile.user.backend='facebookconnect.backends.FacebookConnectBackend'
fb_profile.access_token = access_token
fb_profile.save()
return fb_profile.user
except FacebookProfile.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
def fbc_authenticate_backend(request, next_url=None):
#import ipdb; ipdb.set_trace()
user = FacebookConnectBackend.authenticate(request)
message = ''
created = False
authenticated = False
created = False
if user is None:
cookie = facebook_login_check(request.COOKIES)
if not cookie and not request.GET.has_key('code'):
return False, user, created
if not cookie:
#code = request.GET['code']
#redirect_uri = '%s%s' % (settings.DOMAIN, reverse('facebookconnect_authenticate'))
#access_token = get_access_token(code, redirect_uri)
access_token = request.session['access_token']
else:
access_token = cookie["access_token"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment