Adding Social Authentication to Django – Real Python

Установка библиотеки

В качестве первого шага мы должны установить и включить библиотеку social-auth-app-django в нашем проекте django. Мы можем установить эту библиотеку, используя pip или pipenv в соответствии с нашей средой/личными предпочтениями.

Если мы выберем pip:

pip install social-auth-app-django

или если мы используем pipenv:

pipenv install social-auth-app-django

После того, как библиотека установлена, мы должны добавить приложение в список INSTALLED_APPS в файле настроек проекта, используя идентификатор social_django:

Добавление бэкэнда аутентификации Google OAuth2

Как упоминалось ранее, мы будем использовать учетные записи Google для установления аутентификации, поэтому нам нужно добавить бэкэнд Google OAuth2 в список бэкэндов аутентификации. Кроме того, мы должны явно включить бэкэнд аутентификации модели по умолчанию, чтобы продолжить использование сайта администратора django с использованием локальных учетных записей:

AUTHENTICATION_BACKENDS = (
    'social_core.backends.google.GoogleOAuth2',
    'django.contrib.auth.backends.ModelBackend',
)

Настройка API аутентификации Google

Как только мы добавили бэкэнд, мы должны настроить его для использования в приложении. Для выполнения этой задачи мы переходим в консоль разработчиков Google и, попав туда, переходим в раздел «Учетные данные» в левом меню. Появится диалоговое окно для выбора или создания проекта. В настоящее время у нас все еще нет проектов, поэтому мы выберем второй вариант для его создания.

Теперь нам нужно выполнить следующие задачи:

  1. Дайте описательное имя проекту. Это поможет нам поддерживать чистоту при управлении несколькими приложениями.
  2. Создайте учетные данные, выбрав идентификатор клиента OAuth в меню «Создать учетные данные».
  3. Выберите веб-приложение и заполните необходимые данные. URI авторизованного перенаправления используются бэкэндом аутентификации Google для повторного перенаправления пользователей в приложение после выполнения аутентификации.
  4. Нажмите на кнопку Создать, и ключ и секрет будут сгенерированы. Нам понадобятся эти параметры на следующем шаге.
Похожее:  authentication - What is the purpose of a "Refresh Token"? - Stack Overflow

Настройка проекта на бэкэнде

Теперь пришло время настроить сервер аутентификации в нашем проекте. Мы должны отредактировать файл настроек и инициализировать ключ Google OAuth2 и секрет, используя ключи, полученные в процессе генерации учетных данных:

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'INSERT_PROVIDED_KEY_HERE'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'INSERT_PROVIDED_SECRET_HERE'

Нам также необходимо добавить ключи LOGIN_URL, LOGIN_REDIRECT_URL и LOGOUT_REDIRECT_URL в файл конфигурации. Библиотека social-app-django использует ключ LOGIN_URL, чтобы перенаправить пользователя на страницу аутентификации Google.

LOGIN_URL = '/auth/login/google-oauth2/'

LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'

Для завершения процесса настройки нам нужно добавить несколько маршрутов:

from django.conf import settings
from django.contrib.auth.views import logout

urlpatterns = [
  ...,
  path('', include('social_django.urls', namespace='social')),
  path('logout/', logout, {'next_page': settings.LOGOUT_REDIRECT_URL},
    name='logout'),
  ...,
]

Нам также нужно добавить следующий ключ в файл настроек:

SOCIAL_AUTH_URL_NAMESPACE = 'social'

На этом этапе конфигурация должна быть готова. Теперь пришло время внести некоторую логику в представления и шаблоны!

Добавление логики в представления и шаблоны

Как мы уже говорили ранее, мы создаем простое приложение для блога. Поведение по умолчанию здесь – показывать сообщения только при аутентификации пользователя. Мы помещаем логику, чтобы управлять этим поведением в представлении:

Configuration

Update settings.py to include/register the library in our project:

INSTALLED_APPS=('django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','django_social_project','social.apps.django_app.default',)TEMPLATE_CONTEXT_PROCESSORS=('django.contrib.auth.context_processors.auth','django.core.context_processors.debug','django.core.context_processors.i18n','django.core.context_processors.media','django.core.context_processors.static','django.core.context_processors.tz','django.contrib.messages.context_processors.messages','social.apps.django_app.context_processors.backends','social.apps.django_app.context_processors.login_redirect',)AUTHENTICATION_BACKENDS=('social.backends.facebook.FacebookOAuth2','social.backends.google.GoogleOAuth2','social.backends.twitter.TwitterOAuth','django.contrib.auth.backends.ModelBackend',)

Once registered, update the database:

Update the Project’s urlpatterns in urls.py to include the main auth URLs:

Configure django allauth

Next, let’s set up Django Allauth for our Django app.

For Django Allauth to work with our Django app, update INSTALLED_APPS inside the settings.py file like so:

# social_app/settings.pyINSTALLED_APPS=["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.contrib.sessions","django.contrib.messages","django.contrib.staticfiles","django.contrib.sites",# new# 3rd party"allauth",# new"allauth.account",# new"allauth.socialaccount",# new# social providers"allauth.socialaccount.providers.github",# new"allauth.socialaccount.providers.twitter",# new]

First, we added the Django “sites” framework, which is required for Allauth to work properly. We then added the core Allauth apps: allauth, allauth.account, and allauth.socialaccount.

Create a new django project

Start by creating a virtual environment and installing Django:

Feel free to swap out venv and Pip for Poetry or Pipenv. For more, review Modern Python Environments.

Now create a new project, apply the migrations, and run the server:

Django allauth

Pros:

Integration examples

For each authentication provider, the top portion of your REST API settings.py file should look like this:

INSTALLED_APPS= (
    ...
    # OAuth
    'oauth2_provider',
    'social_django',
    'rest_framework_social_oauth2',
)

TEMPLATES= [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                # OAuth
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        },
    }
]

REST_FRAMEWORK= {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        ...
        # OAuth# 'oauth2_provider.ext.rest_framework.OAuth2Authentication',  # django-oauth-toolkit < 1.0.0
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication',  # django-oauth-toolkit >= 1.0.0'rest_framework_social_oauth2.authentication.SocialAuthentication',
    )
}

Listed below are a few examples of supported backends that can be used for social authentication.

Python social auth

Pros:

Python social auth setup

Follow the steps below and/or the official installation guide to install and setup the basic configuration.

Installation

Install with pip:

Templates

Create a new folder called “templates”, and add two files to it called _base.html and home.html:

Update TEMPLATES in settings.py so that Django knows where to find the templates:

templates/_base.html:

templates/home.html

Create a view to serve up the home.html template:

Add the new URL:

Views

Next, add the following view functions:

Вконтакте

Зайдите на страницу и нажмите Создать приложение, выберите Тип “Веб-сайт” и введите адрес сайта и имя домена. В ответ получите “ID приложения” и “Защищенный ключ”.

Добавьте их в settings.py, пример:

VK_APP_ID = '1234567'
VKONTAKTE_APP_ID = VK_APP_ID
VK_API_SECRET = 'Q0owlQESOXRYd2lcgnLa'
VKONTAKTE_APP_SECRET = VK_API_SECRET

Краткий обзор oauth

Для обеспечения аутентификации пользователей Google поддерживает несколько протоколов, включая OAuth 2. OAuth – это открытый протокол, который обеспечивает безопасную авторизацию для веб-приложений, приложений для мобильных устройств и настольных компьютеров простым и стандартным способом.

На этой диаграмме вы можете увидеть, как это работает:

Полное руководство о том, как использовать этот протокол для доступа к API Google, доступно здесь.

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

Обновление аватарок при авторизации

В статье Django Social Auth: now with images имеется пример как через сигналы обновлять аватарку пользователю, на мой вгляд, код служит только для примера.

Регистрации в сетях

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

Установка и настройка django-social-auth

Для начала установим приложение:

pip install django-social-auth

Теперь отредактируйте settings.py:

Шаблон


В шаблоне вы можете добавить подобный код для получения иконки с url авторизации

Шаг 3 – создать приложение веб-сайта в вашем проекте

Нужно перейти в раздел учётных данных и в комбобоксе

создания учётных данных

пользователя выбрать пункт

идентификатор клиента OAuth.

Из предложенных вариантов выбирайте Веб-приложение.

Шаг 4 – настройка страницы запроса учётных данных

Здесь будет предложено выбрать ваш email. как разработчика, можно добавить и какой-то иной.


Далее название продукта.

И URL главной страницы вашего сайта, остальное по желанию

Виджет для вывода кнопочек

Это просто шаблонный inclusion-тег, который выводит ссылочки в виде кнопочек-логотипов социальных сетей, выглядит примерно так:

Сам виджет я не стал публиковать в PyPI, так как не считаю это важным, вам следует просто скопировать исходники отсюда

После чего добавьте в settings.py следующий список:

Conclusion

This tutorial detailed how to set up social auth with Django and Django Allauth. You should now have a solid understanding of how to wire up new social auth providers:

Friendly views

For now, we just need two views – login and home.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *