Integracja logowania/rejestracji z Facebookiem poprzez OAUTH

Integracja rejestracji/logowania z Facebookiem na wielu serwisach jest bardzo przydatna. W Django jest na to kilka sposobów. Podstawowy element to autoryzacja poprzez OAUTH, a dodatkowy to wykorzystanie Facebookowego Graph API do pobierania/tworzenia danych (np. pobieranie informacji o użytkowniku, tworzeniu postów na jego tablicy itp.)

Obsługę autoryzacji zapewni django_facebook_oauth (dostępnych jest kilka forków). Do Graph API można wykorzystać Facepy - token z oauth zapisywany jest w bazie przez django_facebook_oauth.

Instalacja i konfiguracja django_facebook_oauth

Po instalacji (pobranie i poprzez setup.py) w projekcie Django w settings.py do INSTALLED_APPS dodaj facebook. Następnie dodaj dodatkowe parametry:
LOGIN_REDIRECT_URL = '/.../' # ustaw adres przekierowania
FACEBOOK_APP_ID = ' ' # podaj dane aplikacji FB
FACEBOOK_APP_SECRET = ' '

FACEBOOK_FORCE_SIGNUP = False
FACEBOOK_SCOPE = 'user_activities,email,read_stream,publish_stream' # przykladowy zestaw uprawnien

AUTHENTICATION_BACKENDS = ('facebook.backend.FacebookBackend', 'django.contrib.auth.backends.ModelBackend')
AUTH_PROFILE_MODULE = 'facebook.FacebookProfile'

FACEBOOK_APP_ID i FACEBOOK_APP_SECRET wypełniamy danymi aplikacji Facebookowej stworzonej na potrzeby naszego serwisu. Wybieramy tam zakładkę "Website" i podajemy adres URL strony, która będzie używać tej aplikacji. Po zapisaniu konfiguracji będzie App ID i App Secret.

Do urls.py dodajemy
url(r'^facebook/login/$', 'facebook.views.login'),
url(r'^facebook/authentication_callback$', 'facebook.views.authentication_callback'),

Wykorzystanie django_facebook_oauth i facepy w Django

Jeżeli użytkownik jest zalogowany i rejestrował się za pomocą Facebooka to będzie istnieć request.user.get_profile().get_facebook_profile(). Niezalogowanym do automatycznej rejestracji / logowania poprzez Facebooka dajemy link /facebook/login/. Po tej operacji użytkownik przekierowany zostanie na LOGIN_REDIRECT_URL.

Oto dwa przykładowe widoki, podobne do tych dla fandjango.
# -*- coding: utf-8 -*-
#!/usr/bin/python
from django.shortcuts import render_to_response
from django.conf import settings
from django.template import RequestContext
from django.http import HttpResponseRedirect,HttpResponse
from django.core.urlresolvers import reverse
from django.contrib import messages

from facebook.models import FacebookProfile
from facepy import GraphAPI

def show_index(request):
    """
    Show the main page
    """
    if request.user.is_authenticated():
        try:
            facebook_profile = request.user.get_profile().get_facebook_profile()
        except:
            # zalogowany, ale bez powiązania z FB
            facebook_profile = False
    else:
        facebook_profile = False
    
    return render_to_response(
        'fbdemo/show_index.html',
        {'facebook_profile': facebook_profile},
        context_instance=RequestContext(request))

def show_my_posts(request):
    """
    Using graph api example
    """
    if request.user.is_authenticated():
        try:
            fb = FacebookProfile.objects.get(user=request.user)
        except:
            return HttpResponseRedirect(reverse('fbdemo.views.show_index'))
        
        graph = GraphAPI(fb.access_token)
        # Get my latest posts
        posts = graph.get('me/posts')
        
        return render_to_response(
            'fbdemo/show_my_posts.html',
            {'posts': posts},
            context_instance=RequestContext(request))
        
    else:
        return HttpResponseRedirect(reverse('fbdemo.views.show_index'))
Główny widok wyświetla podstawowe dane dostępne w profilu facebook_profile (jeżeli istnieje), a drugi to przykład podpięcia facepy (Graph API) - wykorzystanie tokena z modelu FacebookProfile.
RkBlog

Django, 6 May 2012

Comment article
Comment article RkBlog main page Search RSS Contact