Django - Урок 036. Как добавить аутентификацию через социальные сети. ВКонтакте

django, Social

По рекомендации пользователей сайта начал добавлять авторизацию через социальные сети на сайт. Первой такой социальной сетью стала ВКонтакте, как наиболее популярная социальная сеть у пользователей моего сайта.

Django сам по себе имеет необходимый функционал по работе с протоколом OAuth 2.0, который мог используется в API ВКонтакте для авторизации пользователей на сторонних ресурсах (и не только для авторизации). Но в данном случае я не стал писать свой велосипед, используя голую поддержку OAuth в Django, а нашёл очень хорошую батарейку, которая пожалуй достаточно известна среди разработчиков сайтов на Django, которая позволила внедрить авторизацию через ВКонтакте всего за пару часов.

Эта батарейка называется Python Social Auth Django .

Давайте пошагово разберёмся, что нам нужно сделать, чтобы подключить авторизацию через ВКонтакте на сайт с Django

Шаг 1 - Установка Python Social Auth Django

Делается это одной командой в вашем виртуальном окружении через утилиту pip

pip install social-auth-app-django

В документации предлагается при конфигурировании два вариант ORM для работы системы аутентификации через социальные сети. Это классическая ОРМ Django и ОРМ MongoEngine, но так получилось, что требуемый для MongoEngine пакет устарел и немного несовместим с последними версиями Django, просто не работает, даже в документации разработчиков mongoengine висит призыв о помощи с поддержкой утилиты. Поэтому будем настраивать только для классической ОРМ.

Шаг 2 - Регистрация батарейки на вашем сайте

Прописываем приложение аутентификации в INSTALLED_APPS

INSTALLED_APPS = (
    ...
    'social_django',
    ...
)

Шаг 3 - Миграция базы данных

Вам потребуется применить изменения в структуре базы данных, поскольку данная батарейка имеет свои таблицы для работы с авторизацией пользователей.

./manage.py migrate

Далее последуем ещё одной рекомендации по настройке базы данных, если Вы, как и я, используете PostgreSQL. А именно...

При использовании PostgreSQL рекомендуется использовать встроенное поле JSONB для хранения извлеченных дополнительных_данных. Чтобы включить его, задайте настройку:

SOCIAL_AUTH_POSTGRES_JSONFIELD = True

Шаг 4 - Настройка бекендов аутентификации

Также прописываем в settings.py

AUTHENTICATION_BACKENDS = (
    'social_core.backends.vk.VKOAuth2',          # бекенд авторизации через ВКонтакте
    'django.contrib.auth.backends.ModelBackend', # бекенд классической аутентификации, чтобы работала авторизация через обычный логин и пароль
)

Обязательно включите бекенд классической аутентификации, иначе потеряете возможность зайти через логин и пароль на сайт.

Шаг 5 - Настройка процессора шаблонов

У меня за полтора года разработки данного сайта настройка TEMPLATES осталась практически нетронутой, но я добавил одну строку для этой батарейки

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'social_django.context_processors.backends', # Добавил эту строку
            ],
        },
    },
]

Шаг 6 - Настройка ключей для ВКонтакте

Здесь дана настройка секретных ключей для ВКонтакте

SOCIAL_AUTH_VK_OAUTH2_KEY = 'XXXXXXX'
SOCIAL_AUTH_VK_OAUTH2_SECRET = 'XXXXXXXXXXXXXXXXXXXX'

Чтобы их получить, нужно создать в инструментарии разработчика ВКонтакте приложение и взять ID вашего приложения и секретный ключ для него.

Регистрируем приложение

Заходим в его настройки и видим всё, что нужно

В итоге прописываем в данные переменные следующие настройки

SOCIAL_AUTH_VK_OAUTH2_KEY = 'ID приложения'
SOCIAL_AUTH_VK_OAUTH2_SECRET = 'Защищённый ключ'

Шаг 7 - Подключение маршрутов для авторизации в urls.py

Делается это так

urlpatterns = [
    ...
    path('', include('social_django.urls')),
]

Шаг 8 - Добавление ссылки на маршрут

А теперь добавим ссылочку на маршрут где-нибудь в шаблоне, чтобы запускать авторизацию через ВКонтакте

<a href="/login/vk-oauth2"><img src="/static/lvk.png" class="avatar-3" data-toggle="tooltip" title="{% trans 'Login via VKontakte' %}"></a>

Шаг 9 - Настройка редиректа при авторизации

Это необязательная настройка, которая укажет URL для перенаправления пользователя на вашем страницы после успешной авторизации. Оставим корень сайта

LOGIN_REDIRECT_URL = '/'

Там уже разберётесь, как вам лучше будет сделать

Шаг 10 - Запрос разрешений на получение доступа к email

У меня на сайте используется своя система рассылки сообщений уведомлений по почте, поэтому мне важно иметь доступ к email пользователю, чтобы уведомлять его о новых событиях на ресурсе, поэтому добавим запрос на получение доступа к email.

SOCIAL_AUTH_VK_OAUTH2_SCOPE = ['email']

Для Django рекомендую VDS-хостинг TIMEWEB

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate
  • #
  • 14 июля 2018 г. 0:17

Мне интересно что будет если в обеих сетях в авторизации одинаковый еmail. Не выведет ли ошибку ?

Не, не будет, в данной батарейке уже есть необходимый функционал по разрулированию этой проблемы. Аутентификации из разных социальных сетей будут сливаться на один аккаунт. Так что всё нормально должно быть.

В следующей статье будет описан этот момент. Опубликую статью в понедельник.
  • #
  • 7 августа 2018 г. 0:10

интересно можно ли через эту батарейку получить данные на данные в вк(друзья, фото итд)

Там можно запросить доступ к тому или иному функционалу, а вот полное использование API, как я понимаю, потребует либо дописывания функционала, или использование ещё каких-нибудь батареек

Нашёл ошибку в вашем примере

какая именно? написали бы сразу ))

ИИ

Здравствуйте, у меня такая проблема: https://ibb.co/D1Y4L7g

Не могли бы вы помочь

index/ на конце url лишний у вас.

ИИ

А для insta какую ссылку вставить? 'social:begin' instagram, instagram-oauth2 - не работают

Вы ключи-то для инстаграмма настроили?

Add instagram backend to AUTHENTICATION_SETTINGS:

AUTHENTICATION_SETTINGS = (
  ...
  'social_core.backends.instagram.InstagramOAuth2',
  ...
)

fill Client Id and Client Secret values in the settings:

SOCIAL_AUTH_INSTAGRAM_KEY = ''
SOCIAL_AUTH_INSTAGRAM_SECRET = ''

extra scopes can be defined by using:

SOCIAL_AUTH_INSTAGRAM_AUTH_EXTRA_ARGUMENTS = {'scope': 'likes comments relationships'}
ИИ

Да это все я прописал и только это я и нашел в сети, я хотел узнать название ссылки

Ну из того, что я нашёл в документации и в исходниках модуля, следует, что всё-таки instagram. То есть правильно писать так

{% url 'social:begin' 'instagram' %}

Если не работает, то причина скорее в чём-то другом. Данный url рендерится у вас на странице например?

ИИ

http://localhost:8000/account/login/login/instagram/
No module named 'Social_core' Вот что пишет, а остальные работают в этом плане

Покажите, что у вас записано в бэкендах

AUTHENTICATION_BACKENDS = (
    'social_core.backends.vk.VKOAuth2',        
    'django.contrib.auth.backends.ModelBackend',
)

Дело в том, что есть django-social-auth, а есть python-social-auth. Одно - это форк другого. Это одно и тоже по сути, только один вообще для всего, а второй специально для django заточен, но есть некоторые отличия у них, например в путях.

ИИ
AUTHENTICATION_BACKENDS = (
    'social_core.backends.vk.VKOAuth2',          
    'django.contrib.auth.backends.ModelBackend', 
    'social_core.backends.facebook.FacebookOAuth2',
    'Social_core.backends.instagram.InstagramOAuth2',
)

Насколько помню, Джанговский бэкенд для аутентификации должен быть самым последним в этом списке

AUTHENTICATION_BACKENDS = (
    'social_core.backends.vk.VKOAuth2',  
    'social_core.backends.facebook.FacebookOAuth2',
    'Social_core.backends.instagram.InstagramOAuth2',
    'django.contrib.auth.backends.ModelBackend', 
)
ИИ

У меня, честно говоря, с этим были проблемы я пока отключил его. Не могу зайти через обычные логин и пароль, выдает No module named 'Social_core'. Но и после этого также, также остается проблема с инстаграм

VP

Интересно, но вот никак не могу разобраться, как можно получить список хотя бы имён друзей пользователя?

Честно, этим не занимался, но для этого нужно добавлять дополнительные запросы на разрешение к доступу к списку друзей и т.д. Рекомендую вам обратиться к документации самого ВКонтакте.

m
  • #
  • 29 сентября 2019 г. 7:39

Добрый день! Подскажите, пожалуйста, какие урлы для вк предоставляет эта батарейка? Не совсем понимаю,какой запрос мне надо отправить, чтобы авторизоваться и так далее...

Добрый день.
В данном примере все url подключаются в корень сайта.

urlpatterns = [
    ...
    path('', include('social_django.urls')),
]

Соответственно сразу для попытки логина нужно лишь написать следующий url /login/vk-oauth2

Остальные редиректы и прочее работает автоматически. Заводится с пол пинка. Если очень интересно, какие маршруты формируются, то в режиме дебага откройте несуществующую страницу, чтобы вызвать ошибку 404 и посмотрите там, какие url добавились.

url формируются в зависимости от того, где у вас подключаются маршруту данной батарейки в вашем сайте. Поэтому их начальная часть может выглядеть как угодно, чего я точно в вашем проекте знать не могу.

m
  • #
  • 29 сентября 2019 г. 8:56

Спасибо за оперативный ответ!
Я сейчас разрабатываю приложение на андроид и параллельно пытаюсь писать сервер на джанго, поэтому запуталась, как к чему подключаться
Я правильно понимаю, что после успешной авторизации клиент должен отправить на сервер полученный токен и свой айди? И если да, то по какому адресу он должен это сделать?

Если честно то с авторизацией в мобильном приложении я не работал. Знаю, что для таких вещей используют батарейку Django Rest Framework, с помощью которого можно получить токена для самого сайта, чтобы идентифицировать пользователя приложения, и через него всё ходит. Но подробный процесс я не знаю, мобильными приложениями в этом ключе совсем не занимался.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Ищу работу?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

e
14 октября 2019 г. 14:59
erina_m

C++ - Тест 003. Условия и циклы

  • Результат:78баллов,
  • Очки рейтинга2
S
14 октября 2019 г. 4:09
Sergey1985

C++ - Тест 001. Первая программа и типы данных

  • Результат:80баллов,
  • Очки рейтинга4
AM
12 октября 2019 г. 17:24
Arshak Martirosyan

C++ - Тест 001. Первая программа и типы данных

  • Результат:66баллов,
  • Очки рейтинга-1
Последние комментарии
14 октября 2019 г. 7:48
Евгений Легоцкой

Добрый день. Нет, если сами по себе координаты при ресайзе все подсчитываются правильно, то это уже проблема графической подсистемы в ОС и работы с X11, если вы конечно под Linux собирали проект…
m
13 октября 2019 г. 9:17
magrif

Здравствуйте. Сделал подобным образом ресайз и в Qt Widgets, и в QML. Везде получаю, что при изменении размера через левую или верхннюю границы проихсодит мерцание подобно как на этом виде…
6 октября 2019 г. 13:44
Евгений Легоцкой

Может база не открылась в прошлый раз. Либо пересобрали проект. хз, если честно ))
s
6 октября 2019 г. 11:27
sander-007

Добрый день Евгений. Спасибо за пример, все понятно. Попытался сделать по аналогии сохранение в базе MySQL заготовок отчетов excel, но MySQL ругается на нарушение в строке запроса. Я подозреваю,…
30 сентября 2019 г. 3:33
Евгений Легоцкой

Если честно то с авторизацией в мобильном приложении я не работал. Знаю, что для таких вещей используют батарейку Django Rest Framework, с помощью которого можно получить токена для самого сайта…
Сейчас обсуждают на форуме
14 октября 2019 г. 14:51
Евгений Легоцкой

Добрый день. Первое, что приходит на ум, то можно подружить это дело через веб сокеты. Со стороны Django - это использование батарейки django-channels, а со стороны это QtWebSockets. …
11 октября 2019 г. 3:11
Евгений Легоцкой

Понятно. Мне нужен пример вашего кода с проблемой. Если сможете накидать вырезку из вашего проекта, которую можно будет скомпилировать и посмотреть, что там происходит, то попробую помочь. Но бы…
t
10 октября 2019 г. 10:58
tantrido

Вот ответ на мой вопрос: https://doc.qt.io/qt-5/qtvirtualkeyboard-deployment-guide.html#creating-inputpanel The input panel must be a sibling element next to the application conta…
9 октября 2019 г. 15:45
Евгений Легоцкой

Добрый день. Нет, я таким не сталкивался, но вот таким образом вы можете разбить тот тег, на ноды, и забрать текст в нормально порядке, а потом вам уже не составит труда, как я думаю, запи…
9 октября 2019 г. 12:04
Вадим Полшков

Здравствуйте. Все получилось, только редирект сделал по другому redirect(price.file.url) Спасибо вам за помощь!
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB