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 dodajemyurl(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'))
Comment article