Автор оригинала: 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, имеющего внешний ключ к экземпляру пользователя, и сохранения полного имени пользователя. аналогичного подхода можно придерживаться и для других пользовательских полей.