Автор оригинала: Rishabh Agrahari.
Небольшой веб-сайт Django, имеющий следующие функции
- Войдите в систему с помощью Facebook
- Войдите в систему с помощью Google
- Пользовательская модель пользователя.
Исходный код можно найти на Github [ ссылка ]
Давайте погрузимся в этот проект
Пользовательская модель пользователя
Я использовал ту же пользовательскую модель пользователя, что и в Twilio Project Итак, я не думаю, что мы должны тратить наше время на это, давайте сразу погрузимся в более важные вещи, социальные логины 🙂
Джанго-аллаут
Django-allauth-это удивительный пакет django, который поддерживает несколько схем аутентификации, включая логины OAuth. Установка очень проста и может быть выполнена в документации django-allauth здесь .
Поток протокола 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, имеющего внешний ключ к экземпляру пользователя, и сохранения полного имени пользователя. аналогичного подхода можно придерживаться и для других пользовательских полей.