2. Daniel Greenfeld
@pydanny
Who am I?
Daniel Greenfeld (@pydanny)
Pythonista at Cartwheel
Djangonaut at Revsys
http://opencomparison.org
Fiancé of Audrey Roy
http://www.flickr.com/photos/pydanny/4442245488
10. Daniel Greenfeld
@pydanny
Use OAUTH
• People use Twitter/Facebook/etc
11. Daniel Greenfeld
@pydanny
Use OAUTH
• People use Twitter/Facebook/etc
• Fewer passwords to memorize
12. Daniel Greenfeld
@pydanny
Use OAUTH
• People use Twitter/Facebook/etc
• Fewer passwords to memorize
• Our site needn’t store passwords
13. Daniel Greenfeld
@pydanny
Use OAUTH
• People use Twitter/Facebook/etc
• Fewer passwords to memorize
• Our site needn’t store passwords
• Twitter/Facebook/etc gets to worry about
security
19. Daniel Greenfeld
@pydanny
Different flavors
• Twitter
• Facebook
• Google
20. Daniel Greenfeld
@pydanny
Different flavors
• Twitter
• Facebook
• Google
• Linkedin
21. Daniel Greenfeld
@pydanny
Different flavors
• Twitter
• Facebook • Github (YAY!)
• Google
• Linkedin
22. Daniel Greenfeld
@pydanny
Different flavors
• Twitter
• Facebook • Github (YAY!)
• Google • Facebook ARGH
• Linkedin
23. Daniel Greenfeld
@pydanny
Different flavors
• Twitter
• Facebook • Github (YAY!)
• Google • Facebook ARGH
• Linkedin
The OAUTH specification is not honored well
24. Daniel Greenfeld
@pydanny
Different flavors
• Twitter
• Facebook • Github (YAY!)
• Google • Facebook ARGH
• Linkedin
The OAUTH specification is not honored well
Implementation changes are sometimes not announced
28. Daniel Greenfeld
@pydanny
Django Auth Options
http://djangopackages.com/grids/g/authentication/
29. Daniel Greenfeld
@pydanny
Django Auth Options
Dozens more if
you scroll
http://djangopackages.com/grids/g/authentication/
30. Daniel Greenfeld
@pydanny
Many problems
• django-tastypie and Piston are for APIs
• Most of these lack tests
• Most of these lack documentation
• Bad code smell
37. Daniel Greenfeld
@pydanny
django-social-auth
• Tests!
• Docs!
• Good code smell!
38. Daniel Greenfeld
@pydanny
Statistics
http://djangopackages.com/packages/p/django-social-auth/
39. Daniel Greenfeld
@pydanny
Statistics
Many
downloads
http://djangopackages.com/packages/p/django-social-auth/
40. Daniel Greenfeld
@pydanny
Statistics
Ongoing development
Many
downloads
http://djangopackages.com/packages/p/django-social-auth/
41. Daniel Greenfeld
@pydanny
Statistics
Ongoing development
Many
downloads
Many eyes on the problem
http://djangopackages.com/packages/p/django-social-auth/
43. Daniel Greenfeld
@pydanny
Get the dependency
pip install django-social-auth==0.5.13
44. Daniel Greenfeld
@pydanny
Part I: settings.py
INSTALLED_APPS = (
...
'social_auth',
...
)
AUTHENTICATION_BACKENDS = (
'social_auth.backends.contrib.github.GithubBackend',
# keep this so you have that admin level backend access!
'django.contrib.auth.backends.ModelBackend',
)
45. Daniel Greenfeld
@pydanny
Part II: settings.py
from django.template.defaultfilters import slugify
SOCIAL_AUTH_ENABLED_BACKENDS = ('github',)
SOCIAL_AUTH_COMPLETE_URL_NAME = 'socialauth_complete'
SOCIAL_AUTH_ASSOCIATE_URL_NAME = 'associate_complete'
SOCIAL_AUTH_DEFAULT_USERNAME = lambda u: slugify(u)
SOCIAL_AUTH_EXTRA_DATA = False
SOCIAL_AUTH_CHANGE_SIGNAL_ONLY = True
SOCIAL_AUTH_ASSOCIATE_BY_MAIL = True # associate user via email
(Usually you can just go with these as your settings)
46. Daniel Greenfeld
@pydanny
Part III: root urls.py
urlpatterns = patterns("",
url('', include('social_auth.urls')),
...
)
47. Daniel Greenfeld
@pydanny
Part IV: profile/views.py
from social_auth.signals import pre_update
from social_auth.backends.contrib.github import GithubBackend
from profiles.models. import Profile
def github_user_update(sender, user, response, details, **kwargs):
profile_instance, created = Profile.objects.get_or_create(user=user)
profile_instance.save()
return True
pre_update.connect(github_user_update, sender=GithubBackend)
(Not specifying this view in urls - django-social-auth does it for me)
48. Daniel Greenfeld
@pydanny
Try it yourself!
http://djangopackages.com/login/