Авторизация через социальные сети посредством OAuth 2.0
Зачем вход через соцсети
Пользователи не любят придумывать ещё один пароль. Кнопка «Войти через GitHub/Google/VK/Яндекс» снижает барьер регистрации. Технически это работает по протоколу OAuth 2.0.
Как работает OAuth 2.0
Пользователь Ваш сайт GitHub
│ «Войти через GitHub» │ │
│─────────────────────▶│ редирект на /authorize │
│◀─────────────────────│────────────────────────────▶
│ вход и «Разрешить доступ» │
│───────────────────────────────────────────────────▶
│ редирект на callback?code=XYZ │
│─────────────────────▶│ обмен code → access_token │
│ │───────────────────────────▶│
│ │ профиль по токену │
│ │◀───────────────────────────│
│ вы вошли! │ создать/найти User, login()│
│◀─────────────────────│ │
Ваш сайт не получает пароль от GitHub — только токен с ограниченными правами (например, читать email и имя).
Установка social-auth
pip install social-auth-app-django
INSTALLED_APPS = [
...
"social_django",
]
python manage.py migrate
Появятся таблицы для связей «пользователь ↔ аккаунт в соцсети».
Маршруты:
# mysite/urls.py
path("social-auth/", include("social_django.urls", namespace="social")),
Бэкенды аутентификации
AUTHENTICATION_BACKENDS = [
"django.contrib.auth.backends.ModelBackend",
"account.authentication.EmailAuthBackend",
"social_core.backends.github.GithubOAuth2",
"social_core.backends.google.GoogleOAuth2",
]
В social_core есть бэкенды для десятков сервисов: vk.VKOAuth2, yandex.YandexOAuth2, facebook.FacebookOAuth2 и др.
Регистрация приложения на GitHub
- GitHub → 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/social-auth/complete/github/. - Сохраните Client ID и сгенерируйте Client Secret.
SOCIAL_AUTH_GITHUB_KEY = os.environ.get("GITHUB_KEY")
SOCIAL_AUTH_GITHUB_SECRET = os.environ.get("GITHUB_SECRET")
SOCIAL_AUTH_GITHUB_SCOPE = ["user:email"]
Для Google — аналогично в Google Cloud Console (OAuth client ID, тип Web application), callback .../social-auth/complete/google-oauth2/, настройки SOCIAL_AUTH_GOOGLE_OAUTH2_KEY и SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET.
Секреты
Client Secret — такой же секрет, как пароль. Только переменные окружения, никакого git.
Кнопки на странице входа
<div class="social">
<a href="{% url 'social:begin' 'github' %}" class="btn">Войти через GitHub</a>
<a href="{% url 'social:begin' 'google-oauth2' %}" class="btn">Войти через Google</a>
</div>
После входа пользователь попадёт на LOGIN_REDIRECT_URL.
Пайплайн
social-auth обрабатывает вход цепочкой функций — пайплайном: получить данные профиля, найти существующую связь, создать пользователя, связать аккаунт, обновить данные. Его можно расширять своими шагами. Например, создавать профиль для новых пользователей:
# account/pipeline.py
from .models import Profile
def create_profile(backend, user, *args, **kwargs):
Profile.objects.get_or_create(user=user)
SOCIAL_AUTH_PIPELINE = [
"social_core.pipeline.social_auth.social_details",
"social_core.pipeline.social_auth.social_uid",
"social_core.pipeline.social_auth.auth_allowed",
"social_core.pipeline.social_auth.social_user",
"social_core.pipeline.user.get_username",
"social_core.pipeline.user.create_user",
"account.pipeline.create_profile",
"social_core.pipeline.social_auth.associate_user",
"social_core.pipeline.social_auth.load_extra_data",
"social_core.pipeline.user.user_details",
]
HTTPS и локальная разработка
Некоторые провайдеры (Google, Facebook) требуют HTTPS даже для callback. Для разработки можно использовать django-extensions с runserver_plus --cert-file или туннели (ngrok). В продакшене HTTPS будет настроен через Let's Encrypt (модуль «Деплой»).
Альтернатива: django-allauth
Ещё одна популярная библиотека — django-allauth: регистрация, подтверждение email и соцсети в одном пакете, с готовыми шаблонами. Выбор между ними — дело вкуса; принципы OAuth одинаковые.
Итог
- OAuth 2.0: сайт получает токен, а не пароль; ключевой шаг — обмен кода на токен.
social-auth-app-django: приложениеsocial_django, бэкенды вAUTHENTICATION_BACKENDS, маршрутыsocial:.- Ключи приложения — в переменных окружения, callback-адрес —
/social-auth/complete/<backend>/. - Пайплайн позволяет встроить свою логику (например, создание профиля).
Практика решено 0 из 6
Расставьте шаги входа через GitHub по протоколу OAuth 2.0.
- Ваш сервер обменивает код на access token
- GitHub перенаправляет обратно на ваш callback-адрес с кодом авторизации
- Сайт перенаправляет его на страницу авторизации GitHub
- Сервер по токену получает профиль пользователя и выполняет вход
- Пользователь входит на GitHub и разрешает доступ
- Пользователь нажимает «Войти через GitHub» на вашем сайте
Что получает ваш сайт при входе через OAuth?
Добавьте в AUTHENTICATION_BACKENDS бэкенд входа через GitHub из пакета social-auth:
social_core.backends.github.GithubOAuth2, сохранив стандартный ModelBackend.
AUTHENTICATION_BACKENDS = [
"django.contrib.auth.backends.ModelBackend",
"social_core.backends.github.GithubOAuth2",
]
Задайте ключи GitHub-приложения в настройках, беря их из переменных окружения
GITHUB_KEY и GITHUB_SECRET (через os.environ.get). Имена настроек — SOCIAL_AUTH_GITHUB_KEY и SOCIAL_AUTH_GITHUB_SECRET.
import os
SOCIAL_AUTH_GITHUB_KEY = os.environ.get("GITHUB_KEY")
SOCIAL_AUTH_GITHUB_SECRET = os.environ.get("GITHUB_SECRET")
Как построить в шаблоне ссылку входа через GitHub с social-auth? Напишите значение атрибута href (тег url).
{% url 'social:begin' 'github' %}Какой callback URL нужно указать при регистрации OAuth-приложения на GitHub для локальной разработки (маршруты social-auth подключены по префиксу social-auth/)?
Войдите, чтобы отмечать пройденные уроки.