Статьи о Джанго

Аутентификация OAuth в Django с помощью social-auth

Во время разработки моего последнего проекта django мне приходилось обеспечивать аутентификацию пользователей с помощью учетных записей Google. Для этого я использовал библиотеку social-app-django, которая реализует механизм аутентификации/регистрации, который поддерживает несколько провайдеров аутентификации и протоколов, таких как OAuth (версии 1 и 2) или OpenId.

Краткий обзор OAuth

Для обеспечения аутентификации пользователей Google поддерживает несколько протоколов, включая OAuth 2. OAuth - это открытый протокол, который обеспечивает безопасную авторизацию для веб-приложений, приложений для мобильных устройств и настольных компьютеров простым и стандартным способом. Протокол основан на доверенной третьей стороне для установления процесса аутентификации. Он предоставляет клиентский доступ к ресурсу, делегирующему процесс авторизации на внешний сервер авторизации с разрешения владельца ресурса.

На этой диаграмме вы можете увидеть, как это работает:

Полное руководство о том, как использовать этот протокол для доступа к API Google, доступно здесь.

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

1. Установка библиотеки

В качестве первого шага мы должны установить и включить библиотеку social-auth-app-django в нашем проекте django. Мы можем установить эту библиотеку, используя pip или pipenv в соответствии с нашей средой/личными предпочтениями.

Если мы выберем pip:

pip install social-auth-app-django

или если мы используем pipenv:

pipenv install social-auth-app-django

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

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'social_django',
]

2. Добавление бэкэнда аутентификации Google OAuth2

Как упоминалось ранее, мы будем использовать учетные записи Google для установления аутентификации, поэтому нам нужно добавить бэкэнд Google OAuth2 в список бэкэндов аутентификации. Кроме того, мы должны явно включить бэкэнд аутентификации модели по умолчанию, чтобы продолжить использование сайта администратора django с использованием локальных учетных записей:

AUTHENTICATION_BACKENDS = (
    'social_core.backends.google.GoogleOAuth2',
    'django.contrib.auth.backends.ModelBackend',
)

3. Настройка API аутентификации Google

Как только мы добавили бэкэнд, мы должны настроить его для использования в приложении. Для выполнения этой задачи мы переходим в консоль разработчиков Google и, попав туда, переходим в раздел «Учетные данные» в левом меню. Появится диалоговое окно для выбора или создания проекта. В настоящее время у нас все еще нет проектов, поэтому мы выберем второй вариант для его создания.

Теперь нам нужно выполнить следующие задачи:

  1. Дайте описательное имя проекту. Это поможет нам поддерживать чистоту при управлении несколькими приложениями.
  2. Создайте учетные данные, выбрав идентификатор клиента OAuth в меню «Создать учетные данные».
  3. Выберите веб-приложение и заполните необходимые данные. URI авторизованного перенаправления используются бэкэндом аутентификации Google для повторного перенаправления пользователей в приложение после выполнения аутентификации.
  4. Нажмите на кнопку Создать, и ключ и секрет будут сгенерированы. Нам понадобятся эти параметры на следующем шаге.

Google включает аутентификацию с OAuth 2 через API Google+, поэтому нам нужно включить ее. Перейдите в раздел API и сервисы и нажмите кнопку «Включить API и сервисы». Затем найдите Google+ API и включите его.

4. Настройка проекта на бэкэнде

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

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'INSERT_PROVIDED_KEY_HERE'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'INSERT_PROVIDED_SECRET_HERE'

Нам также необходимо добавить ключи LOGIN_URL, LOGIN_REDIRECT_URL и LOGOUT_REDIRECT_URL в файл конфигурации. Библиотека social-app-django использует ключ LOGIN_URL, чтобы перенаправить пользователя на страницу аутентификации Google. LOGIN_REDIRECT_URL и LOGOUT_REDIRECT_URL устанавливают URL-адреса, по которым пользователь будет перенаправлен после событий входа и выхода.

LOGIN_URL = '/auth/login/google-oauth2/'

LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'

Для завершения процесса настройки нам нужно добавить несколько маршрутов:

from django.conf import settings
from django.contrib.auth.views import logout

urlpatterns = [
  ...,
  path('', include('social_django.urls', namespace='social')),
  path('logout/', logout, {'next_page': settings.LOGOUT_REDIRECT_URL},
    name='logout'),
  ...,
]

Нам также нужно добавить следующий ключ в файл настроек:

SOCIAL_AUTH_URL_NAMESPACE = 'social'

На этом этапе конфигурация должна быть готова. Теперь пришло время внести некоторую логику в представления и шаблоны!

5. Добавление логики в представления и шаблоны

Как мы уже говорили ранее, мы создаем простое приложение для блога. Поведение по умолчанию здесь - показывать сообщения только при аутентификации пользователя. Мы помещаем логику, чтобы управлять этим поведением в представлении:

from django.shortcuts import render
from .models import Post


def index(request):
    context = {
        'posts': Post.objects.order_by('-date')
        if request.user.is_authenticated else []
    }

    return render(request, 'blog/index.html', context)

Как видите, представление отправляет список сообщений в шаблон только после аутентификации пользователя.

В шаблоне мы помещаем код для отображения постов и ссылку для выхода из системы, но, если пользователь не аутентифицирован, вместо этого мы показываем ссылку для входа.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">

  <title>My fake blog!</title>

  <link
    rel="stylesheet"
    href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"
    integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4"
    crossorigin="anonymous">
</head>
<body>
  <div class="jumbotron">
    <h1>My fake blog!</h1>
    {% if user.is_authenticated %}
      <p>Logged as {{ user.username }}</p>
      <a class="btn btn-primary" href="{% url 'logout' %}">Logout</a>
    {% else %}
      <a class="btn btn-primary" href="{% url 'social:begin' 'google-oauth2' %}">
        Login
      </a>
    {% endif %}
  </div>

  <div class="container-fluid">
  {% for post in posts %}
    <div>
      <h2>{{ post.title }}</h2>
      <p>{{ post.content }}</p>
      <p>Posted by {{ post.user.username }} | {{ post.date }}</p>
    </div>
  {% endfor %}
  </div>
</body>
</html>

Когда пользователь не имеет доступа к нашему блогу, страница выглядит так:

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

Выводы

В этом посте мы увидели, как библиотека social-app-django позволяет простым способом реализовать аутентификацию OAuth в наших проектах django. В примере приложения блога мы использовали библиотеку для добавления поддержки использования учетных записей Google для аутентификации пользователей приложения. Точно так же мы могли бы использовать другие бэкэнды для добавления аутентификации с помощью твиттера, github, facebook и т. Д.

Наконец, я хотел бы подчеркнуть, что эта библиотека также работает с различными средами Python, что позволяет нам осуществлять аутентификацию так же легко, как мы это делали с django.

Поделитесь с другими: