Закрыть

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

Цитата дня

Vivazzi.ru

Личный сайт Мальцева Артема

Чтобы стать победителем, сначала нужно победить свою лень.

Django allauth Авторизация через социальную сеть

16 октября 2017 г. 23:04

Django-allauth замечательный пакет для авторизации пользователей на своём сайте, который берёт на себя рутинные операции по регистрации пользователей обычным способом через форму, а также через популярные социальные сети.

Не сложно и самому написать код авторизации для каждой соц. сети, используя их соответствующую документацию. Но мой вам совет, используйте готовую библиотеку для авторизации, например, рассматриваемую в этой статье Django-allauth, и настройте её под свои нужды. Потому что готовые решения, как правило, берут на себя всю рутину по регистрации, входу на сайт и добавление нескольких учётных записей разных социальных приложений в один аккаунт.

На данный момент приложение поддерживает более 60 соц. сетей (провайдеров).

Кроме типичных полей Имя, Фамилия, Email и Пароль вы легко сможете добавить дополнительные поля. Также можно легко написать свою авторизацию через соц. сеть, если ее нет в списке поддерживаемых, так как провайдеры описаны через единый интерфейс, то есть уснаследуются от одного класса OAuth2Provider или OAuthProvider, который обрабатывает протокол авторизации OAuth 2 или OAuth соответственно.

Хорошо, что Django-allauth предоставляет возможность добавлять несколько email-ов пользователей и указывать основной. Бывает, что пользователь вдруг теряет контроль над одной какой-нибудь своей электронной почтой и тут приходят на помощь резервные email-ы, на которые могут прийти пароли или важные письма с вашего сайта.

Список всех преимуществ вы найдёте в официальной документации  http://django-allauth.readthedocs.io/en/latest/index.html

Доверенный redirect URI

Во многих соц. сетях при добавлении приложения спрашивают про некий Доверенный redirect URI (или Действительные URL-адреса для перенаправления OAuth) например в ВК:

Доверенный redirect URI

Доверенный redirect URI нужен для дополнительной защиты приложения от утечек токенов зарегистрировавшихся пользователей в следствие хакерских атак.

В django-allauth Доверенный redirect URI строится по следующему принципу:

http://[domain]/accounts/[provider]/login/callback/

где [domain] - домен сайта, а [provider] - социальная сеть (приложение) типа vk, google, facebook и т. д.

В некоторых приложениях, в том числе и в ВКонтакте, есть возможность протестировать авторизацию локально на девелоперской машине. Для этого обычно в настройки нужно добавить localhost в Базовые домены и http://localhost:8000/accounts/[provider]/login/callback/ в Доверенный redirect URI.

Простейший пример использования django-allauth

Устанавливаем и настраиваем django-allauth согласно документации  http://django-allauth.readthedocs.io/en/latest/installation.html . Попробуем добавить авторизацию через ВКонтакте. Для начала нужно зарегистрировать своё приложение в VK .

Замечание
В разделе http://django-allauth.readthedocs.io/en/latest/providers.html  размещены поддерживаемые провайдеры и ссылки на документацию по регистрации приложения в соответствующей соц. сети.

Затем нужно убедиться, что провайдер VK добавлен в INSTALLED_APPS. Мои настройки в settings.py для django-allauth выглядят так:

SITE_ID = 1

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                ...
                'django.template.context_processors.request',
            ],
        },
    },
]

AUTHENTICATION_BACKENDS = (
    ...
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
)

INSTALLED_APPS = (
    ...
    # The following apps are required:
    'django.contrib.auth',
    'django.contrib.sites',

    'allauth',
    'allauth.account',
    'allauth.socialaccount',

    # ... include the providers you want to enable:
    'allauth.socialaccount.providers.vk',
    ...
)

В шаблоне:

{% load socialaccount %}
<a href="{% provider_login_url "vk" method="oauth2" %}"> Войти через VK </a>

Для вывода всех подключённых провайдеров, вы можете использовать следующий код:

{% load socialaccount %}
{% get_providers as socialaccount_providers %}

{% for provider in socialaccount_providers %}
    {% if provider.id == "openid" %}
        {% for brand in provider.get_brands %}
          <a title="{{brand.name}}" class="{{provider.id}} {{brand.id}}" href="{% provider_login_url provider.id openid=brand.openid_url process=process %}">{{brand.name}}</a>
        {% endfor %}
    {% endif %}
    <a title="{{provider.name}}" class="{{provider.id}}" href="{% provider_login_url provider.id process=process scope=scope auth_params=auth_params %}">{{provider.name}}</a>
{% endfor %}

И наконец, нужно связать полученные при регистрации приложения client_ID и секретный ключ с сайтом. Для этого в админке перейдите в Социальные приложения и добавьте социальное приложение:

Добавление социального приложения в django-allauth

Часто используемые настройки django-alluath

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

ACCOUNT_EMAIL_REQUIRED = True  
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'

Количество попыток входа в систему я оставляю по умолчанию (равное 5), но время таймаута ограничиваю до 60 секунд:

ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 60

Часто требуются дополнительные поля при регистрации пользователей, поэтому я создаю дополнительную форму:

class CustomSignupForm(forms.Form):
    first_name = forms.CharField(max_length=30, widget=forms.TextInput(attrs={'placeholder': _('First name')}))
    last_name = forms.CharField(max_length=30, widget=forms.TextInput(attrs={'placeholder': _('Last name')}))

    GENDERS = (('man, _('Man')), ('woman', _('Woman')))
    gender = forms.ChoiceField(label=_('Gender'), choices=GENDERS, widget=forms.Select())

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.gender = self.cleaned_data['gender']

        user.save()

А затем подключаю её в settings.py:

ACCOUNT_SIGNUP_FORM_CLASS = 'spec.forms.CustomSignupForm'

Теперь при выводе формы в шаблоне, мы увидим не только базовые поля (email и пароль), но и свои дополнительные поля. Получить такую форму в коде можно так:

# -*- coding: utf-8 -*-
from allauth.account.forms import LoginForm, SignupForm


def show_auth(request):
    return render(request, 'auth.html', {'singup_form': SignupForm(), 'login_form': LoginForm()})

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

# settings.py
SOCIALACCOUNT_AUTO_SIGNUP = False

И очень полезная настройка - кастомный редирект после входа на сайт:

# settings.py
ACCOUNT_ADAPTER = 'project.users.adapter.MyAccountAdapter'

# spec/adapter.py
from django.conf import settings
from allauth.account.adapter import DefaultAccountAdapter

class MyAccountAdapter(DefaultAccountAdapter):

    def get_login_redirect_url(self, request):
        return '/users/{}/'.format(request.user.username)

Оцените статью

4,5 из 5 (всего 2 оценки)

Поля, отмеченные звёздочкой ( * ) , являются обязательными.

Спасибо за ваш отзыв!

Автор статьи

Права на использование данной статьи, расположенной на настоящей странице http://vivazzi.ru/it/allauth/:

Разрешается копировать статью с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Мальцев Артём
Ссылка на статью: <a href="http://vivazzi.ru/it/allauth/">http://vivazzi.ru/it/allauth/</a>

Подробнее: Правила использования сайта

Вам нужно саморазвиваться или вы хотите зарабатывать деньги?

Или вы ищите хорошие IT сервисы или книги? Сохраните свое время и взгляните на мою подборку рекомендаций, которыми постоянно пользуюсь.
Посмотреть рекомендации

Комментариев: 0

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

Чтобы оставить комментарий от своего имени войдите или зарегистрируйтесь обычным способом или через социальные сети:

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте