- Реєстрації в мережах
- Вконтакте
- Google+
- GitHub
- Установка і настройка django-social-auth
- Віджет для виведення кнопочок
- Оновлення аватарок при авторизації
Авторизація на сайтах через соціальні мережі дуже зручна, не треба заповнювати реєстраційні форми і т.д., вам досить натиснути на відповідну кнопку і вас авторизує сам сайт, при цьому потрібні дані він зможе отримати з сайту джерела (тієї соціальної мережі, з якої виконується авторизація).
Далі будемо обговорювати тільки django-social-auth.
Взагалі, нам цікаво два сховища:
- Основний, від omab ;
- І другий, зі свежой підтримкою російських соціалок від krvss , В який я пуляв фікси.
Реєстрації в мережах
Для початку нам треба отримати ключі від необхідних соціальних мереж, на сторінці проекту в GitHub є інструкції для безлічі соціальних мереж, але свого часу у мене були труднощі і я вирішив записати послідовність дій для деяких з них.
Зайдіть на і натисніть на + Create New App. Введіть назву програми (назва сайту або проекту), після сабмита форми ви побачите реквізити "App ID" та "App Secret".
Додайте їх в свій settings.py, приклад:
FACEBOOK_APP_ID = '696381432507483' FACEBOOK_API_SECRET = '15afb0bbeb173aae12e8e875ffccc7a4'Тепер заповніть поле "App Domains", вкажіть через пробіл домени (наприклад один локальний, інший продакшен домен). Поставте галочку на "Website with Facebook Login" і введіть адресу для редиректу, я редирект в корінь продакшен сайту.
Зайдіть на і введіть логін і пароль від вашого облікового запису в Twitter. Далі заходите на і тиснете на Create a new application, заповніть потрібні поля і погоджуєтесь з правилами, після чого ви отримаєте "Consumer key" і "Consumer secret".
Додайте їх в settings.py, приклад:
TWITTER_CONSUMER_KEY = 'G2wMq4KYpTmgZDcjg0EzQ' TWITTER_CONSUMER_SECRET = 'rGHMGIbOwIEpoxjXzOahc2KmvxY8h10DpZ90LwqEjec'За замовчуванням вам видадуть Access level "Read-only", для авторизації цього вам вистачить. рекомендую прочитати The Application Permission Model .
Вконтакте
Зайдіть на сторінку і натисніть створити додаток , Виберіть Тип "Веб-сайт" і введіть адресу сайту і ім'я домену. У відповідь отримаєте "ID додатки" і "Захищений ключ".
Додайте їх в settings.py, приклад:
VK_APP_ID = '1234567' VKONTAKTE_APP_ID = VK_APP_ID VK_API_SECRET = 'Q0owlQESOXRYd2lcgnLa' VKONTAKTE_APP_SECRET = VK_API_SECRETДля чого дублювати змінні, я питав у блозі автора і отримав відповідь. також дивіться документацію по бекенду.
Google+
Зайдіть на сторінку, натисніть Create, введіть потрібну інформацію і у вкладці API Access побачите "Client ID" і "Client secret".
Додайте їх в settings.py, приклад:
GOOGLE_OAUTH2_CLIENT_ID = '123456789.apps.googleusercontent.com' GOOGLE_OAUTH2_CLIENT_SECRET = 'p0dJSDjs-dAJsdSAdaSDadasdrt'GitHub
Зайдіть на сторінку і введіть логін і пароль від вашого облікового запису в GitHub. Введіть назву програми, адреси сайту для "URL" і "Callback URL" (у мене це один адреса кореневої сторінки сайту). І отримаєте "Client ID" і "Client Secret", після чого додайте їх в settings.py:
GITHUB_APP_ID = 'da3bad06987041629b96' GITHUB_API_SECRET = '8bb53dd4a0b1bbc12f77e147c11d5fd6082adb8d'Тепер перейдемо до налаштування social_auth.
Установка і настройка django-social-auth
Для початку встановимо додаток:
pip install django-social-authТепер відредагуйте settings.py:
# Додаємо в AUTHENTICATION_BACKENDS потрібні бекенди, # дивіться повний список AUTHENTICATION_BACKENDS = ( 'social_auth.backends.twitter.TwitterBackend', 'social_auth.backends.facebook.FacebookBackend', 'social_auth.backends.contrib.vk.VKOAuth2Backend', 'social_auth.backends .google.GoogleOAuth2Backend ',' social_auth.backends.contrib.github.GithubBackend ',' django.contrib.auth.backends.ModelBackend ',) # Додаємо в TEMPLATE_CONTEXT_PROCESSORS процесор "social_auth_by_name_backends" TEMPLATE_CONTEXT_PROCESSORS = (' django.contrib.auth.context_processors .auth ',' django.core.context_processors.request ',' social_auth.context_processors.social_auth_by_name_backends ',) # І додаємо "social_auth" в INSTALLED_APPS INSTALLED_APPS = (...' social_auth ',)Додаткові настройки social_auth, додайте в settings.py:
import random # Якщо ім'я не вдалося отримати, то можна його згенерувати SOCIAL_AUTH_DEFAULT_USERNAME = lambda: random.choice ([ 'Darth_Vader', 'Obi-Wan_Kenobi', 'R2-D2', 'C-3PO', 'Yoda']) # дозволяємо створювати користувачів через social_auth SOCIAL_AUTH_CREATE_USERS = True # Перерахуємо pipeline, які послідовно буду обробляти респонс SOCIAL_AUTH_PIPELINE = (# Отримує по backend і uid інстанси social_user і user 'social_auth.backends.pipeline.social.social_auth_user', # Отримує по user.email інстанси користувача і замінює собою той, який отримали вище. # До речі, email видає тільки Facebook і GitHub, а Vkontakte і Twitter не видають 'social_auth.backends.pipeline.associate.associate_by_email', # Намагається зібрав ь правильний username, на основі вже наявних даних 'social_auth.backends.pipeline.user.get_username', # Створює нового користувача, якщо такого ще немає 'social_auth.backends.pipeline.user.create_user', # Намагається зв'язати акаунти 'social_auth.backends .pipeline.social.associate_user ', # Отримує і оновлює social_user.extra_data' social_auth.backends.pipeline.social.load_extra_data ', # обновляє інстанси user додатковими даними з бекенда' social_auth.backends.pipeline.user.update_user_details ')Підключіть Рауса в urls.py:
urlpatterns = patterns ( '', ... url (r '', include ( 'social_auth.urls')),)Синхронізація БД:
./manage.py syncdb ./manage.py migrate social_authДокументацію можна подивитися тут:
Віджет для виведення кнопочок
Це просто шаблонний inclusion-тег, який виводить ссилочку у вигляді кнопочок-логотипів соціальних мереж, виглядає приблизно так:
Сам віджет я не став публікувати в PyPI, тому що не вважаю це важливим, вам слід просто скопіювати вихідні звідси
Після чого додайте в settings.py наступний список:
SOCIAL_AUTH_PROVIDERS = [{ 'id': p [0], 'name': p [1], 'position': { 'width': p [2] [0], 'height': p [2] [1] ,}} for p in (( 'github', u'Login via GitHub ', (0, -70)), (' facebook ', u'Login via Facebook', (0, 0)), ( 'twitter' , u'Login via Twitter ', (0, -35)),)]У вашому шаблоні з формою авторизації використовувати так:
{% Load social_auth_widget%} <form action = "" method = "post"> <input name = "username" /> <input name = "password" /> <input type = "submit" value = "Sign in" / > {% social_auth_widget%} </ form>Оновлення аватарок при авторизації
у статті Django Social Auth: now with images є приклад як через сигнали оновлювати аватарку користувачеві, на мій дивіться, код служить тільки для прикладу.