Автентифікація через соціальні мережі

Швидко і доступно...

22.08.2015

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

Вступ

Перш за все треба зрозуміти, що таке автентифікація взагалі.
Найпоширеніша проблема, це коли плутають автентифікацію з авторизацією. У той час як аутентифікація процес перевірки того, що "ви той за кого себе видаєте", а авторизація процес перевірки того, що "ви маєте право робити те, що намагаєтеся зробити".

Визначаємось з підтримуваними способами

Щоб нарешті приступити до роботи, треба визначитись які сервіси будуть підтримуватись.
Наприклад візьмемо наступні: VK, Facebook, Google+.

Реєструємо там аплікації

Переходимо на сторінку Developers.Facebook.com, натискаємо "My Apps", та обираємо "Add a New App". У вікні яке відкрилось обираємо необхідну платформу (у нашому випадку "Веб-сторінка"). Вводимо назву нашої аплікації та натискаємо "Create New Facebook App ID". Далі може перепитати чи це тестова версія іншої аплікації, якщо ви створювали якусь раніше. Доречі, чим хороша тестова версія — це тим, що можна тестувати інтеграцію вашого сервісу з соц. мережою не порушуючи роботу основної версії.
Коли ми створили новий додаток, його можна знайти у списку клікнувши "My Apps". Відкривши її, можна побачити: App ID та App Secret. Їх ми і будемо використовувати для нашого сайту. Ще необхідно вказати адресу для переадресації користувача після успішної автентифікації, наприклад: http://localhost/
Для цього натисніть "Add platform" виберіть Website і вставте посилання у полі Site URL.
Зверніть увагу, що я використовую 80 порт, якщо ви для запуску використовуєте інший, то обов'язково додайте його http://localhost:8000/
Схожі дії необхідно зробити для решти платформ за посиланнями: VK, Google+

Підключаємо бібліотеки

Перш за все треба встановити python-social-auth за допомогою файлу requirements.txt (якщо ви його використовуєте) чи команди
pip install python-social-auth==0.2.12
Версія могла змінитись з часу написання статті.

У файлі settings.py треба додати наступні рядки, підставивши значення App ID та App Secret:
SOCIAL_AUTH_FACEBOOK_KEY = "< App ID >"
SOCIAL_AUTH_FACEBOOK_SECRET = "< App Secret >"
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']

SOCIAL_AUTH_VK_OAUTH2_KEY = '< App Key >'
SOCIAL_AUTH_VK_OAUTH2_SECRET = '< App Secret >'
SOCIAL_AUTH_VK_OAUTH2_SCOPE = ['email']

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '< App Key >' SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '< App Secret >' SOCIAL_AUTH_GOOGLE_OAUTH2_USE_DEPRECATED_API = True SOCIAL_AUTH_GOOGLE_PLUS_USE_DEPRECATED_API = True
До змінної INSTALLED_APPS додаємо рядок:
'social.apps.django_app.default',
До змінної TEMPLATE_CONTEXT_PROCESSORS додаємо:
'social.apps.django_app.context_processors.backends',
'social.apps.django_app.context_processors.login_redirect',
Додаємо змінну AUTHENTICATION_BACKENDS:
AUTHENTICATION_BACKENDS = (
    'social.backends.facebook.FacebookOAuth2',
    'social.backends.vk.VKOAuth2',
    'social.backends.google.GoogleOAuth2',
    'django.contrib.auth.backends.ModelBackend',
)
Також в налаштуваннях можна вказати посилання для успішної та неуспішної авторизації:
LOGIN_REDIRECT_URL = '/'
SOCIAL_AUTH_LOGIN_ERROR_URL = '/'

Далі в головному файлі urls.py, додаємо обробники:
url('', include('social.apps.django_app.urls', namespace='social')),
url('', include('django.contrib.auth.urls', namespace='auth')),

Додаємо посилання для авторизації

Головне, що треба додати - це наступне посилання:
<a href="{% url 'social:begin' 'facebook' %}?next=some_page">Facebook</a>
Якщо треба вказати ще якісь додаткові параметри, наприклад сторінку яку хотів відкрити користувач перед переадресацією, чи будь-яку службову інформацію, то просто додайте до посилання (в атрибут href):
?next=some_page&foo=bar&spam=eggs
Після того як користувач натисне це посилання, він буде переадресований на Facebook і якщо погодиться надати вам дані, то буде переадресований за посиланням, яке ви вказали в налаштуваннях додатку та з параметрами, якщо були додані.
Щоб заборонити доступ неавтентифікованим користувачам можна скористатись декоратором login_required для ваших view
from django.contrib.auth.decorators import login_required

Додаємо стилізовані кнопки

Підключаємо необхідні стилі для кнопок та власне кнопки:
Після цього як користувач авторизується, щоб почити його ім'я, можете вставити в html шаблон :
{{ request.user.username }}

Готово

Тепер можна подумати над тим, щоб винести з налаштувань секретні ключі кудись в окремий файл чи у environment variables, аби вони не були доступні всім. Особливо якщо це код у публічному репозиторії ;-).
І можна робити це публічним додатком, а не тільки доступним для вас. Для цього відкриваєте ваш додаток і в налаштуваннях на вкладці "Status & Review", перемикаєте No -> Yes (див. картинку).
Все ваш сайт доступний для широкого загалу, за умови, що він у вас виставлений на хостингу в Інтернеті.
Якщо ні, то прочитайте мою статтю, про те як швидко запустити сайт на безкоштовному хостингу Heroku.
Також можна створити "тестові" версії цих додатків, аби під час розробки ви не заважали роботі "бойового" сервера і користувачі могли сміло ними користуватись.


Якщо вам сподобалась стаття — поділіться з друзями:  


Коментарі: