Аутентификация 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 и, попав туда, переходим в раздел «Учетные данные» в левом меню. Появится диалоговое окно для выбора или создания проекта. В настоящее время у нас все еще нет проектов, поэтому мы выберем второй вариант для его создания.
Теперь нам нужно выполнить следующие задачи:
- Дайте описательное имя проекту. Это поможет нам поддерживать чистоту при управлении несколькими приложениями.
- Создайте учетные данные, выбрав идентификатор клиента OAuth в меню «Создать учетные данные».
- Выберите веб-приложение и заполните необходимые данные. URI авторизованного перенаправления используются бэкэндом аутентификации Google для повторного перенаправления пользователей в приложение после выполнения аутентификации.
- Нажмите на кнопку Создать, и ключ и секрет будут сгенерированы. Нам понадобятся эти параметры на следующем шаге.
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.
Вернуться на верх