Рубрики
Без рубрики

Django Allauth Учебник | Социальные логины

Учебник о том, как создать небольшой веб-сайт Django, имеющий функции входа в систему с помощью Facebook Login с пользовательской моделью пользователя Google.

Автор оригинала: Rishabh Agrahari.

Небольшой веб-сайт Django, имеющий следующие функции

  • Войдите в систему с помощью Facebook
  • Войдите в систему с помощью Google
  • Пользовательская модель пользователя.

Исходный код можно найти на Github [ ссылка ]

Давайте погрузимся в этот проект

Пользовательская модель пользователя

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

Джанго-аллаут

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

Поток протокола OAuth

Поток протокола OAuth

Django-allauth social login: Архитектура и дизайн

платформа allauth-project использует пользовательскую модель пользователя, расширяющую AbstractBaseUser , Django-allauth имеет приложение с именем ” socialaccount ” для управления социальными логинами. Три модели социального учета, которые нас интересуют:

  • Социальное приложение: Большинство поставщиков OAuth требуют, чтобы мы подписались на так называемый клиент API или приложение, содержащее идентификатор клиента и секрет API. Нам нужно добавить Социальное приложение для хранения этих учетных данных.

  • SocialAccount: Когда Пользователь регистрируется с помощью социальных логинов OAuth, создается объект SocialAccount, содержащий внешний ключ для Пользователя, поставщика для хранения имени поставщика, uid для идентификатора пользователя, last_login, data_joined и, что более важно, extra_data JSONField для хранения всех данных, возвращенных поставщиком OAuth после успешной аутентификации пользователя.

  • Социальный токен: Социальный токен имеет внешний ключ к Социальным приложениям и социальной учетной записи , и он хранит access_token и его expiry_date.

Социальный логин OAuth

Редактировать settings.py для того, чтобы включить социальные логины, такие как Facebook и Twitter:

AUTHENTICATION_BACKENDS = (
    ...
    # Needed to login by username in Django admin, regardless of `allauth`
    'django.contrib.auth.backends.ModelBackend',

    # `allauth` specific authentication methods, such as login by e-mail
    'allauth.account.auth_backends.AuthenticationBackend',
    ...
)


INSTALLED_APPS = (
    ...
    'django.contrib.auth',
    'django.contrib.sites',

    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.facebook',
    'allauth.socialaccount.providers.twitter',
     ...
)

SITE_ID = 1
LOGIN_REDIRECT_URL = "/dashboard/"

#urls.py

urlpatterns = [
    ...
    url(r'^accounts/', include('allauth.urls')),
    ...
]

Здесь/| AUTHENTICATION_BACKENDS добавляет сервер аутентификации allauth. INSTALLED_APPS включает приложения, необходимые для allauth и для входа в социальные сети с помощью Facebook и Twitter. LOGIN_REDIRECT_URL задает URL-адрес, по которому пользователь перенаправляется после успешного входа в систему (включая социальные логины). SOCIALACCOUNT_PROVIDERS устанавливает различные параметры для поставщика OAuth, например ПОЛЯ устанавливает параметры, которые будут сохранены после того, как они будут возвращены поставщиком после входа в социальную сеть. Scope задает параметры, для которых нам нужно разрешение во время процесса "Предоставить разрешение" входа в систему OAuth и т. Д.

Во-первых, нам нужно создать приложение на портале разработчиков Facebook [ link ]. Регистрация приложения даст нам идентификатор клиента и секрет клиента. Аналогично, для Google+ нам нужно создать приложение на консоли разработчика Google [ link ]. Затем нам нужно создать два новых SocialApp для Facebook и Google с этими учетными данными.

Интеграция django-allauth с нашей пользовательской моделью пользователя

Всякий раз, когда пользователь впервые использует социальный логин, он/она должен предоставить разрешение allauth-project. После того, как этот пользователь входит в систему, за кулисами создается экземпляр пользователя, а затем создается экземпляр SocialAccount, allauth устанавливает имя пользователя и адрес электронной почты пользователя, но не другие пользовательские поля, которые мы сделали!, Например, у нас есть full_name поле в нашей пользовательской модели (посмотрите в проекте twilio, та же пользовательская модель, используемая здесь, ссылка ) и extra_data поле SocialAccount экземпляр пользователя-это JSONField, который содержит параметр “full_name”. Поэтому нам нужно запускать сигнал post_save всякий раз, когда социальная учетная запись обновляется или сохраняется. Взглянуть:

def save_profile(sender, instance, **kwargs):
   print(instance)
   instance.user.full_name = instance.extra_data['name']
   uid = instance.extra_data['id']
   instance.user.profile_picture = instance.get_avatar_url()
   instance.user.save()

post_save.connect(save_profile, sender=SocialAccount)

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