I'm currently working on a site (Django 1.3) where all users will be
authenticated through Facebook. To do this, I've written a simple
custom authentication backend:


# custom Facebook authentication backend
from django.contrib.auth.models import User
from site_main.models import *
from fb import facebook

class FBAuthBackend:
    def authenticate(self, token):
        try:
            graph = facebook.GraphAPI(token)
            profile = graph.get_object("me") # will throw an exception
if token is invalid
            uid = profile['id']

            # check for existing user
            user = self.get_user(uid)

            # otherwise create a new user
            if user == None:
                user = User(username=uid)
                #user.set_unusable_password()
                user.set_password(User.objects.make_random_password())
                user.save()
                uprofile = UserProfile(user=user)
                uprofile.save()

            user.first_name = profile['first_name']
            user.last_name = profile['last_name']
            user.save()
            return user
        except:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(username=user_id)
        except:
            return None


This backend works fine - it checks the access token it receives and
creates a new user or returns an existing one, as expected.

I have a couple of login-related views:

from models import *
from django.contrib.auth import *
from django.shortcuts import *
from django.http import *

def site_login(request):
    if 'token' in request.GET:
        u = authenticate(token=request.GET['token'])
        if u:
            login(request, u)
    return redirect('/')

def logintest(request):
    return HttpResponse(str(request.user.is_authenticated()))


The authenticate() call works fine - u is assigned a valid user object
where u.is_authenticated() is True. However, once I navigate to any
other page - for example, the URL that calls logintest, the user is no
longer authenticated, i.e. u._is_authenticated() = False. It's almost
as if the login() call never saved the user into the session.

Please help - I am about ready to tear out my hair over this, and this
is stalling the rest of my development!

Thanks!

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to