Skip to content

Instantly share code, notes, and snippets.

@dpetzold
Created August 5, 2010 19:20
Show Gist options
  • Save dpetzold/510233 to your computer and use it in GitHub Desktop.
Save dpetzold/510233 to your computer and use it in GitHub Desktop.
from django.conf import settings
from django.contrib.auth import models as auth_models
import cgi
import urllib
import simplejson
from <app_name> import models
class FacebookBackend:
def authenticate(self, token=None):
facebook_session = models.FacebookSession.objects.get(
access_token=token,
)
profile = facebook_session.query('me')
try:
user = auth_models.User.objects.get(username=profile['id'])
except auth_models.User.DoesNotExist, e:
user = auth_models.User(username=profile['id'])
user.set_unusable_password()
user.email = profile['email']
user.first_name = profile['first_name']
user.last_name = profile['last_name']
user.save()
try:
models.FacebookSession.objects.get(uid=profile['id']).delete()
except models.FacebookSession.DoesNotExist, e:
pass
facebook_session.uid = profile['id']
facebook_session.user = user
facebook_session.save()
return user
def get_user(self, user_id):
try:
return auth_models.User.objects.get(pk=user_id)
except auth_models.User.DoesNotExist:
return None
{% if error %}
{% if error == 'AUTH_FAILED' %}
<p>Authentication failed</p>
{% else %}{% if error == 'AUTH_DISABLED' %}
<p>Your account is disabled</p>
{% else %}{% if error == 'AUTH_DENIED' %}
<p>You did not allow access</p>
{% endif %}{% endif %}{% endif %}
{% else %}
<a href="https://graph.facebook.com/oauth/authorize?client_id={{ settings.FACEBOOK_APP_ID }}&redirect_uri={{ settings.FACEBOOK_REDIRECT_URI }}&scope=publish_stream,email&display=popup">
<img src="http://developers.facebook.com/images/devsite/login-button.png"/>
</a>
{% endif %}
from django.db import models
from django.contrib.auth.models import User
class FacebookSessionError(Exception):
def __init__(self, error_type, message):
self.message = message
self.type = error_type
def get_message(self):
return self.message
def get_type(self):
return self.type
def __unicode__(self):
return u'%s: "%s"' % (self.type, self.message)
class FacebookSession(models.Model):
access_token = models.CharField(max_length=103, unique=True)
expires = models.IntegerField(null=True)
user = models.ForeignKey(User, null=True)
uid = models.BigIntegerField(unique=True, null=True)
class Meta:
unique_together = (('user', 'uid'), ('access_token', 'expires'))
def query(self, object_id, connection_type=None, metadata=False):
import urllib
import simplejson
url = 'https://graph.facebook.com/%s' % (object_id)
if connection_type:
url += '/%s' % (connection_type)
params = {'access_token': self.access_token}
if metadata:
params['metadata'] = 1
url += '?' + urllib.urlencode(params)
response = simplejson.load(urllib.urlopen(url))
if 'error' in response:
error = response['error']
raise FacebookSessionError(error['type'], error['message'])
return response
FACEBOOK_APP_ID = ''
FACEBOOK_API_KEY = ''
FACEBOOK_API_SECRET = ''
FACEBOOK_REDIRECT_URI = 'http://example.com/login/'
AUTHENTICATION_BACKENDS = (
'<app_name>.backends.FacebookBackend',
)
from django.contrib import auth
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
import cgi
import simplejson
import urllib
from <app_name> import settings
def login(request):
error = None
if request.user.is_authenticated():
return HttpResponseRedirect('/yay/')
if request.GET:
if 'code' in request.GET:
args = {
'client_id': settings.FACEBOOK_APP_ID,
'redirect_uri': settings.FACEBOOK_REDIRECT_URI,
'client_secret': settings.FACEBOOK_API_SECRET,
'code': request.GET['code'],
}
url = 'https://graph.facebook.com/oauth/access_token?' + \
urllib.urlencode(args)
response = cgi.parse_qs(urllib.urlopen(url).read())
access_token = response['access_token'][0]
expires = response['expires'][0]
facebook_session = models.FacebookSession.objects.get_or_create(
access_token=access_token,
)[0]
facebook_session.expires = expires
facebook_session.save()
user = auth.authenticate(token=access_token)
if user:
if user.is_active:
auth.login(request, user)
return HttpResponseRedirect('/yay/')
else:
error = 'AUTH_DISABLED'
else:
error = 'AUTH_FAILED'
elif 'error_reason' in request.GET:
error = 'AUTH_DENIED'
template_context = {'settings': settings, 'error': error}
return render_to_response('login.html', template_context, context_instance=RequestContext(request))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment