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

⏱ 30 мин · 🧩 заданий: 6

Зачем вход через соцсети

Пользователи не любят придумывать ещё один пароль. Кнопка «Войти через 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

  1. GitHub → Settings → Developer settings → OAuth Apps → New OAuth App.
  2. Homepage URL: http://127.0.0.1:8000/.
  3. Authorization callback URL: http://127.0.0.1:8000/social-auth/complete/github/.
  4. Сохраните 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

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Расставить по порядку

Расставьте шаги входа через GitHub по протоколу OAuth 2.0.

  1. Ваш сервер обменивает код на access token
  2. GitHub перенаправляет обратно на ваш callback-адрес с кодом авторизации
  3. Сайт перенаправляет его на страницу авторизации GitHub
  4. Сервер по токену получает профиль пользователя и выполняет вход
  5. Пользователь входит на GitHub и разрешает доступ
  6. Пользователь нажимает «Войти через GitHub» на вашем сайте
Задание 2 Один вариант ответа

Что получает ваш сайт при входе через OAuth?

Задание 3 Написать код

Добавьте в AUTHENTICATION_BACKENDS бэкенд входа через GitHub из пакета social-auth: social_core.backends.github.GithubOAuth2, сохранив стандартный ModelBackend.

Задание 4 Написать код

Задайте ключи GitHub-приложения в настройках, беря их из переменных окружения GITHUB_KEY и GITHUB_SECRET (через os.environ.get). Имена настроек — SOCIAL_AUTH_GITHUB_KEY и SOCIAL_AUTH_GITHUB_SECRET.

Задание 5 Ввод ответа

Как построить в шаблоне ссылку входа через GitHub с social-auth? Напишите значение атрибута href (тег url).

Задание 6 Один вариант ответа

Какой callback URL нужно указать при регистрации OAuth-приложения на GitHub для локальной разработки (маршруты social-auth подключены по префиксу social-auth/)?

Войдите, чтобы отмечать пройденные уроки.