Django Social Registration enables developers to add alternative registration methods based on third party sites.
Supported methods currently are:
- OpenID
- OAuth
- Facebook Connect
pip install django-socialregistration
pip install -e git+https://github.com/facebook/python-sdk.git#egg=FacebookSDK
-
Add
socialregistrationto yourINSTALLED_APPS -
Add
django.core.context_processors.requestto the TEMPLATE_CONTEXT_PROCESSORS -
Include
socialregistration.urlsin your top level urls:urlpatterns = patterns('', # ... url(r'^social/', include('socialregistration.urls'))) -
Make sure you are using a RequestContext wherever you are planning to display the login buttons
from django.template import RequestContext def login(request): # ... return render_to_response('login.html', {}, context_instance = RequestContext(request)) -
Once you're done, and configured, etc, don't forget to
python manage.py syncdbyour project.
-
Add the Facebook API keys to the your settings, variable names are
FACEBOOK_APP_ID = '' FACEBOOK_API_KEY = '' FACEBOOK_SECRET_KEY = '' -
Add
socialregistration.auth.FacebookAuthto AUTHENTICATION_BACKENDS -
Add
socialregistration.middleware.FacebookMiddlewareto MIDDLEWARE_CLASSES -
(Optional) Add
FACEBOOK_REQUEST_PERMISSIONSto your settings. This is a comma seperated list of the permissions you need. e.g:FACEBOOK_REQUEST_PERMISSIONS = 'email,user_about_me'
-
Add tags to your template file
{% load facebook_tags %} {% facebook_button %} {% facebook_js %}You can also specify your own custom button image by appending it to the
facebook_buttontemplate tag:{% facebook_button 'http://example.com/other_facebook_button.png' %}You want to keep the
{% facebook_js %}as far down in your HTML structure as possible to not impact the load time of the page.Also make sure you followed the steps to include a
RequestContextin your template that is using these tags.
-
Add the Twitter API keys and endpoints to your settings, variable names are
TWITTER_CONSUMER_KEY = '' TWITTER_CONSUMER_SECRET_KEY = '' TWITTER_REQUEST_TOKEN_URL = '' TWITTER_ACCESS_TOKEN_URL = '' TWITTER_AUTHORIZATION_URL = '' -
Add
socialregistration.auth.TwitterAuthtoAUTHENTICATION_BACKENDS -
Add the right callback URL to your Twitter account
-
Add tags to your template file
{% load twitter_tags %} {% twitter_button %}Same note here. Make sure you're serving the page with a
RequestContextYou can also specify your own custom button image by appending it to the
twitter_buttontemplate tag:{% twitter_button 'http://example.com/other_twitter_button.png' %}
Check out how the Twitter authentication works. Basically it's just plugging together some urls and creating an auth backend, a model and a view.
- Add
socialregistration.auth.OpenIDAuthtoAUTHENTICATION_BACKENDS
-
Add tags to your template file
{% load openid_tags %} {% openid_form %}
You can use the standard {% url auth_logout %}. Alternatively there is also {% url social_logout %}
which is basically a wrapper around auth_logout.
This will log users only out of your site.
To make sure they're logged out of other sites too, use something like this:
<a href="#" onclick:"javascript:FB.logout(function(resp){ document.location = '{% url social_logout %}'; })">Logout</a>
Or redirect them to the provider they logged in from.
SOCIALREGISTRATION_USE_HTTP = False
SOCIALREGISTRATION_GENERATE_USERNAME = False
Set either True if you want to enable HTTPS or have the users skip the username form.
The app provides two signals that fire when users connect their accounts and log in:
socialregistration.signals.connect
socialregistration.signals.login
The signal handlers needs to accept three arguments, and can listen on specific profiles:
from socialregistration import signals
from socialregistration import models
def connect_facebook(user, profile, client, **kwargs):
# Do fancy stuff like fetching more user info with the client
pass
def login_facebook(user, profile, client, **kwargs):
# Do fancy stuff like finding logged in friends
pass
signals.connect.connect(connect_facebook, sender = models.FacebookProfile)
signals.login.connect(login_facebook, sender = models.FacebookProfile)
This works too with OpenID and OAuth profiles.