Главная

Статьи

Django. Авторизація через соціальні мережі за допомогою django-social-auth

  1. Реєстрації в мережах
  2. Facebook
  3. Twitter
  4. Вконтакте
  5. Google+
  6. GitHub
  7. Установка і настройка django-social-auth
  8. Віджет для виведення кнопочок
  9. Оновлення аватарок при авторизації

Авторизація на сайтах через соціальні мережі дуже зручна, не треба заповнювати реєстраційні форми і т.д., вам досить натиснути на відповідну кнопку і вас авторизує сам сайт, при цьому потрібні дані він зможе отримати з сайту джерела (тієї соціальної мережі, з якої виконується авторизація).

На своїх проектах я використовую кльову бібліотеку django-social-auth , До неї пробував django-ulogin , Але сам сервіс uLogin мені не сподобався ( мої сумбурні замітки про це). На пихе також обговорювали інші бібліотеки , Зокрема loginza, але відгуки про неї погані, тому навіть не пробував. У будь-якому випадку сервіси - це сервіси, і залежність від сервісів це більше проблема (часті падіння сервісів, убогі віджети і зовнішній вигляд без кастомізації і т.п.) ніж залежність від бібліотеки, яка проксірует запити до кінцевих "соціальних мереж".

Далі будемо обговорювати тільки django-social-auth.

Взагалі, нам цікаво два сховища:

  • Основний, від omab ;
  • І другий, зі свежой підтримкою російських соціалок від krvss , В який я пуляв фікси.

Реєстрації в мережах

Для початку нам треба отримати ключі від необхідних соціальних мереж, на сторінці проекту в GitHub є інструкції для безлічі соціальних мереж, але свого часу у мене були труднощі і я вирішив записати послідовність дій для деяких з них.

Facebook

Зайдіть на і натисніть на + Create New App. Введіть назву програми (назва сайту або проекту), після сабмита форми ви побачите реквізити "App ID" та "App Secret".

Додайте їх в свій settings.py, приклад:

FACEBOOK_APP_ID = '696381432507483' FACEBOOK_API_SECRET = '15afb0bbeb173aae12e8e875ffccc7a4'

Тепер заповніть поле "App Domains", вкажіть через пробіл домени (наприклад один локальний, інший продакшен домен). Поставте галочку на "Website with Facebook Login" і введіть адресу для редиректу, я редирект в корінь продакшен сайту.

Twitter

Зайдіть на і введіть логін і пароль від вашого облікового запису в 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 є приклад як через сигнали оновлювати аватарку користувачеві, на мій дивіться, код служить тільки для прикладу.

Новости