Django 5 для начинающих

Прогресс по курсу:  9/1004

7.5 Авторизация через социальные сети посредством OAuth 2.0
3 из 3 шагов пройдено

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

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

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

Мы собираемся реализовать аутентификацию Google и GitHub, используя библиотеку social-auth-app-django.

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

pip install social-auth-app-django

Установите приложение в модуле settings.py:

INSTALLED_APPS = [
    # ...
    'social_django',
]

Примените миграции, чтобы Django создал необходимые модели, связанные с social_django приложением:

python manage.py makemigrations
python manage.py migrate

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

Django отслеживает список серверов аутентификации. Затем он использует эти серверные части для аутентификации пользователя. Этот список определен в settings.py в разделе AUTHENTICATION_BACKENDS.

Давайте определим правильные серверные части, которые нам нужны для нашего приложения. Полный список поддерживаемых сайтов, вы можете посмотреть по этой ссылке.

Я буду использовать механизмы аутентификации Google и Github, так что пока добавим их:

AUTHENTICATION_BACKENDS = (
    'social_core.backends.github.GithubOAuth2',
    'social_core.backends.google.GoogleOAuth2',

    'django.contrib.auth.backends.ModelBackend',
)

django.contrib.auth.backends.ModelBackend - это базовая серверная часть аутентификации, которая по умолчанию входит в Django, чтобы позволить пользователям входить в систему по методу имени пользователя/пароля. Те, что выше, - это серверные части Google и GitHub, которые можно использовать в нашем приложении для социальной аутентификации.

Теперь внутри settings.py перейдите в TEMPLATES список и добавьте следующее в context_processors:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # new code
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        },
    },
]

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

context_processors содержит список путей к вызываемым объектам, которые возвращают словарь для объединения с контекстом каждого представления, избавляя нас от необходимости добавлять одни и те же данные снова и снова.

Хорошо, давайте перейдем к следующей части, которая обновляет модуль mysite/urls.py проекта, чтобы включить URL-адреса приложения социальной аутентификации:

from django.urls import re_path

urlpatterns = [
# .....
                  re_path(r'^oauth/', include('social_django.urls', namespace='social')),
              ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

На этом почти все, чтобы запустить это, следующим шагом будет регистрация нашего приложения в Google и Github.

Аутентификация на Гитхабе

Шаг 1: Войдите в свою учетную запись GitHub.
Шаг 2: Перейдите в Settings -> Developer settings -> OAuth Apps -> New OAuth App.

Homepage URL - http://127.0.0.1:8000/

Authorization callback URL - http://127.0.0.1:8000/oauth/complete/github/

 

За исключением URL-адреса обратного вызова авторизации, вы можете заполнить остальную информацию по своему усмотрению. URL-адрес обратного вызова для авторизации — самая важная часть настройки вашего приложения OAuth.

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

Добавим в settings.py следующий код:

# social auth configs for github
SOCIAL_AUTH_GITHUB_KEY = 'YOUR GITHUB KEY'
SOCIAL_AUTH_GITHUB_SECRET = 'YOUR GITHUB SECRET KEY'

Теперь давайте добавим в наш шаблон login.html следующий код:

<a href="{% url 'social:begin' 'github' %}">Log In with GitHub</a>

Вот и все, теперь вы можете войти на сайт, используя свою учетную запись Github. Давайте проверим.

Перейдем по адресу http://127.0.0.1:8000/accounts/login/:

Нажмем Log In with GitHub, и нас переадресует на страницу авторизации GitHub:

В моем случае, после ввода логина и пароля, мы увидим сообщение об удачной авторизации:

И мы перейдем обратно на наш сайт, где уже будем авторизованы:

Давайте перейдем в профиль и заполним его:

Как мы видим, при социальной аутентификацию, наши профили тоже прекрасно работают. Перейдем в админ панель и посмотрим:

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


  • Комментариев
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

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

Россияне не смогут заходить на сайты через Apple и Google

Еще немного дополню по аутентификации через GitHub (и не только).
Если у вас в профиле сконфигурирован публичный Email (который виден в вашем Public Profile), то его можно получать автоматически.

На GitHub это выглядит так:

В settings.py нужно добавить параметр SOCIAL_AUTH_GITHUB_SCOPE

SOCIAL_AUTH_GITHUB_KEY = '...'
SOCIAL_AUTH_GITHUB_SECRET = '...'
SOCIAL_AUTH_GITHUB_SCOPE = ['email']

В данном случае будет получаться email, видимо, можно настроить получение и других настроек.

В созданном профиле можно увидеть автоматически заполненные поля First name (в него попадает Name) и Email:

Дополню после прохождения следующего шага - для Google настройка выглядит так:

SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE = ['email']
Изменен ilya kutaev

@ilya_kutaev, Сделаем обязательно. Если что, у нас еще есть время до 2025 года))

Изменен Илья Перминов

@Илья_Перминов, Спасибо! Но для начала придется перевести проект на работу по HTTPS протоколу...

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

@Илья_Перминов, В "соседнем" курсе это успешно проделали с помощью RunServerPlus из Django Extensions для запуска тестового сервера по HTTPS, и потребовалась установка пакета Werkzeug, который содержит отладчик для расширения RunServerPlus. Сертификат генерировался тестовый автоматом, т.ч. особо не было сложностей.

Я сам вполне разобрался с аутентификацией через VK, она поменялась довольно ощутимо с момента выхода курса в сентябре.

Но в целом согласен, ничего нового там не обнаружилось, только своя специфика в настройке OAuth2 на стороне VK

Изменен ilya kutaev

 с экономлю время многим участникам 

сюда вводить надо 

Добавим в settings.py следующий код:

# social auth configs for github
SOCIAL_AUTH_GITHUB_KEY = 'YOUR GITHUB KEY'
SOCIAL_AUTH_GITHUB_SECRET = 'YOUR GITHUB SECRET KEY'

 

сюда вводите айди YOUR GITHUB KEY а в следующую строку секрет ключ

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


 

Добавим в settings.py следующий код:

# social auth configs for github
SOCIAL_AUTH_GITHUB_KEY = 'YOUR GITHUB KEY'
SOCIAL_AUTH_GITHUB_SECRET = 'YOUR GITHUB SECRET KEY'

@No_Name, А что не понятно именно? Есть все этапы куда перейти на гитхабе, есть скрины как заполнить регистрацию приложения. И в конце же написано:

После заполнения информации вам будет предоставлен уникальный идентификатор клиента и секрет клиента. 

всё работает, но перестало заходить в админку(

@Максидов_Ш, у вас у администратора нет профиля, мы его добавляли в этом шаге.

Создание профиля у существующего администратора или пользователей

На данный момент у нас может возникнуть ошибка из-за того что у нашего администратора нет профиля. Для этого давайте выполним следующий код в консоли:

$ python manage.py shell
from django.contrib.auth.models import User
from accounts.models import Profile
user = User.objects.get(username='<admin_user_name>')
profile = Profile(user=user)
profile.save()

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

@Илья_Перминов, спасибо, помогло!

@Илья_Перминов, скорее всего человек его создал но там была ошибка и он ничего не понял 

<admin_user_name>

тут надо вписывать имя своего пользователя админа, поправьте пожалуйста я это указал на страничке лекции

Не понимаю, а можно ли сделать авторизацию через GitHub без настройки "New OAuth App"?. Конечный пользователь же не будет создавать в профиле github OAuth App для каждого сайта. Как быть в данном случае?

@Антон_Глухенко, это делается только владельцем сайта, вы регистрируете свое OAuth приложение в GitHub, чтобы добавить URL-адрес обратного вызова. Пользователи не будут ничего регистрировать, они будут просто входить на ваш сайт через GitHub.

@Антон_Глухенко, А в настройках GitHub что указали в поле "Authorization callback URL"?

@Илья_Перминов, первый раз указал http://127.0.0.1:8000/oauth/complete/github/ и тогда возникла ошибка AuthFail. Но после замены в поле Authorization callback URL на http://localhost/oauth/complete/github/ все заработало

@Антон_Глухенко, Чудеса)) Я сейчас специально попробовал, у меня все наоборот. Через локалхост появляется ошибка.

У меня при переходе по ссылке авторизации на github выводит Page Not Found

@Кирилл_Смирнов, отправьте свой проект Илье на почту perminoff-ilya@yandex.ru, он вечером посмотрит.

@Дмитрий_Селезнев, хорошо, сейчас отправлю!

@Кирилл_Смирнов

Я изменил значения SOCIAL_AUTH_GITHUB_KEY и SOCIAL_AUTH_GITHUB_SECRET на свои, и у меня все стало работать.

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

Homepage URL - http://127.0.0.1:8000/

Authorization callback URL - http://127.0.0.1:8000/oauth/complete/github/

У вас ошибка "The redirect uri MUST match the registered callback URL for this application", тоесть OAuth сервису GitHub не нравится ваш Authorization callback URL.

Изменен Илья Перминов

@Илья_Перминов, такая же ошибка (Homepage URL: http://127.0.0.1:8000/, Authorization callback URL: http://127.0.0.1:8000/oauth/complete/github/). Я правильно понимаю, что SOCIAL_AUTH_GITHUB_KEY == Client ID, SOCIAL_AUTH_GITHUB_SECRET==Client secrets?

@Сак_Валентин, Да, верно. У вас жалуется на Authorization callback URL, проверьте его, он должен быть http://127.0.0.1:8000/oauth/complete/github/

@Илья_Перминов, ссылка со страницы приложения на github: http://127.0.0.1:8000/oauth/complete/github/. Я не вижу отличий:) 

Такая же проблема с Google, судя по всему.

@Сак_Валентин, Можете тогда прислать свой проект мне на почту - perminoff-ilya@yandex.ru, я посмотрю. Или можете сами поискать ошибку в коде, возможно пропустили какойто абзац лекции.

@Илья_Перминов, спасибо, нашел ошибку, конечно же:)

@Valentin_Sak, Валентин, не подскажете в чем проблема была? перерыл уже все, аналогичную ошибку выдает, как и у всех.

У него была ошибка [SSL: CERTIFICATE_VERIFY_FAILED], это ошибка только на MacOS. А какая у вас ошибка?

@Илья_Перминов, о которой речь шла выше:  The redirect_uri MUST match the registered callback URL for this application
обычно код сам писал для закрепления, тут уже и скопировал все десять раз и перепроверил Authorization callback URL, Homepage URL и айди с секретом,  все перечитал из лекции - ничего не пропустил. Странно

Можете прислать мне свой проект на почту perminoff-ilya@yandex.ru, я посмотрю.

@Илья_Перминов, спасибо, отправил архив с проектом

@Илья_Перминов, Все Илья, не тратьте время, кажется разобрался. У меня было два суперюзера, во избежание конфликтов, когда мы к обычным полям еще профиль прикручивали, я удалил первого основного админа и остальных юзеров, после чего у меня слетела вся база данных. Восстановил ее из нашего бэкапа, и у меня в админке появилось опять 3 пользователя - последний по новому образцу с профилем, первые 2 кривые. Сейчас их удалил, база слетела опять, но зато получается войти через гитхаб. Дальше сам. Извините за беспокойство))

@Илья_Перминов, вы говорите создать ключ так я создал 
Попробуйте еще раз создать ключ, возможно в этих пунктах у вас опечатка или какая-то ошибка:

что вводить сюда ??? где это брать вообще???

Добавим в settings.py следующий код:

# social auth configs for github
SOCIAL_AUTH_GITHUB_KEY = 'YOUR GITHUB KEY'
SOCIAL_AUTH_GITHUB_SECRET = 'YOUR GITHUB SECRET KEY'