Как защитить REST API Flask с помощью JSON Web Token?

Давайте узнаем, как защитить REST API с помощью веб-токенов JSON, чтобы пользователи и сторонние приложения не злоупотребляли им..


Мы создадим службу базы данных, используя SQLite и разрешить пользователям доступ к нему через API REST, используя методы HTTP, такие как POST и PUT.

Кроме того, мы узнаем, почему веб-токены JSON являются подходящим способом защиты остальных API вместо дайджеста и базовой аутентификации. Прежде чем мы продолжим, давайте разберемся с терминами веб-токенов JSON, REST API и инфраструктурой Flask..

Веб-токены JSON

Веб-токен JSON, также известный как JWT, это безопасный способ передачи случайных токенов между двумя сторонами или организациями. JSON обычно состоит из трех частей:.

  • полезная нагрузка
  • заголовок
  • Подпись

JSON использует два типа структурных форм при передаче данных или информации между двумя сторонами.

  • Сериализированные
  • Десериализованный

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

В сериализованной форме есть три компонента.

  • заголовок
  • полезная нагрузка
  • Подпись

Компонент заголовка определяет криптографическую информацию о токенах. Например:

  • Это подписанный или неподписанный JWT?
  • Определить методы алгоритма

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

  • полезная нагрузка
  • заголовок

REST API

API (интерфейс прикладного программирования) позволяет взаимодействовать между двумя приложениями для получения или отправки данных. Существует два популярных типа API – веб и системный API..

В этой статье мы рассмотрим только веб-API. Есть два типа веб-API.

  • Запрос – API ответа: Rest, GraphQL, Удаленный вызов процедур (RPC)
  • Управляемый событиями API: WebHooks, веб-сокеты, потоковая передача HTTP

REST API подпадает под категорию запрос-ответ. Он использует методы HTTP, такие как GET, POST и PUT для выполнения операций API.

Классический пример – когда пользователь отправляет метод GET в веб-службу для запроса или получения определенного ресурса или коллекции ресурсов. Затем сервер отправляет обратно определенный ресурс или набор ресурсов обратно пользователю, который его запросил..

Flask Framework

Flask – это фреймворк, основанный на python. Это микро-фреймворк, используемый разработчиками Python для построения API остальных. Он называется микро-фреймворком, потому что он позволяет разработчикам, например, добавлять пользовательскую аутентификацию и любую другую серверную систему на основе предпочтений.

Давайте начнем с реализации. Моя система настройки выглядит следующим образом.

  • Ubuntu как ОС
  • Python 2.7+
  • Почтальон

Настройте виртуальную среду с помощью virtualenv

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

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

pip install virtualenv

Если у вас нет пипа на вашей машине, следуйте этому документация установить pip в вашей системе.

Далее, давайте создадим каталог для хранения или хранения нашей виртуальной среды. Используйте команду mkdir, показанную ниже, чтобы создать каталог

Мкдир колбапроект

Перейдите в каталог flaskproject с помощью следующей команды

cd колбапроект

Внутри каталога flaskproject используйте инструмент virtualenv для создания виртуальной среды, как показано ниже:

Virtualenv колба

После того, как вы использовали инструмент virtualenv для создания виртуальной среды, выполните команду cd, чтобы перейти в каталог flaskapi в качестве виртуальной среды, и активируйте его с помощью приведенной ниже команды..

Исходный бин / активировать

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

Установить пакеты с помощью pip

Теперь пришло время установить пакеты, такие как флеш-каркас и PyJWT, которые мы будем использовать для создания остальных API и других необходимых пакетов для нашего проекта API..

Создайте файл require.txt со следующими пакетами.

колба
Дата и время
UUID
Колба-SQLAlchemy
PyJWT

Установите их с помощью pip.

pip install -r needs.txt

Настройте базу данных

Давайте установим SQLite.

apt-get установить sqlite3

Создайте базу данных с именем библиотеки. Внутри этой базы данных мы создадим две таблицы, а именно таблицу Users и Authors..

Таблица пользователей будет содержать зарегистрированных пользователей. Только зарегистрированные пользователи могут иметь доступ к таблице авторов.

Таблица авторов будет хранить информацию об авторах или детали, такие как имя автора, страна рождения и т. Д., Предоставленные зарегистрированными пользователями..

Создайте базу данных, используя следующую команду:

sqlite3 library.db

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

.базы данных

Откройте новый терминал и выполните следующее в виртуальной среде, которую мы создали ранее.

коснитесь app.py

Вставьте следующий код в файл с именем app.py

из колбы импорт колба, запрос, jsonify, make_response
из flask_sqlalchemy импортировать SQLAlchemy
из werkzeug.security import generate_password_hash, check_password_hash
импорт uuid
импорт JWT
дата импорта время
импортные обертки от functools

Первая строка в приведенном выше коде импортирует пакеты, такие как request и jsonify. Мы будем использовать запрос для отслеживания данных уровня запроса во время запроса и будем использовать jsonify для вывода ответов в JSON формат.

На следующей строке мы импортировали SQLAlchemy из flask_sqlalchemy, чтобы интегрировать функции SQLAlchemy в колбу..

Из werkzeug.security мы импортировали generate_password_hash для генерации хэша пароля для пользователей и check_password_hash для проверки пароля пользователя при сравнении пароля, отправленного пользователями, с паролями пользователей, хранящимися в базе данных..

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

Тем не менее, в файле app.py реализуйте параметры конфигурации для API библиотеки, используя код ниже в файле app.py.

Поместите следующий код под оператором импорта.

app = Flask (__name__)

app.config [ ‘secret_key’] = ‘Th1s1ss3cr3t’
app.config [ ‘SQLALCHEMY_DATABASE_URI’] = ‘SQLite: /////home/michael/geekdemos/geekapp/library.db’
app.config [‘SQLALCHEMY_TRACK_MODIFICATIONS’] = True

db = SQLAlchemy (приложение)

Теперь создайте две модели для таблицы «Пользователи» и «Авторы», как показано ниже. Скопируйте и вставьте код в файл app.py.

Поместите код ниже прямо под этим параметром базы данных db = SQLAlchemy (приложение)

Класс Users (db.Model):
id = db.Column (db.Integer, primary_key = True)
public_id = db.Column (db.Integer)
name = db.Column (db.String (50))
password = db.Column (db.String (50))
admin = db.Column (db.Boolean)
Авторы класса (db.Model):
id = db.Column (db.Integer, primary_key = True)
name = db.Column (db.String (50), уникальная = True, nullable = False))
book = db.Column (db.String (20), unique = True, nullable = False))
country = db.Column (db.String (50), nullable = False))
booker_prize = db.Column (db.Boolean)

Генерация таблиц пользователей и авторов

На терминале введите следующий код в виртуальной среде, чтобы сгенерировать или создать таблицы для таблиц Users и Authors, как показано ниже.

из базы данных импорта приложений
db.create_all ()

После этого откройте файл app.py внутри виртуальной среды и создайте другую функцию..

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

Поместите этот код под модель базы данных для таблицы авторов

def token_required (f):
@wraps (е)
def decorator (* args, ** kwargs):

токен = нет

if ‘x-access-tokens’ в request.headers:
token = request.headers [‘x-access-tokens’]

если не токен:
return jsonify ({‘message’: ‘отсутствует допустимый токен’})

пытаться:
data = jwt.decode (токен, app.config [SECRET_KEY])
current_user = Users.query.filter_by (public_id = data [‘public_id’]). first ()
Кроме:
return jsonify ({‘message’: ‘токен неверен’})

return f (current_user, * args, ** kwargs)
декоратор возврата

Создать маршруты для таблицы пользователей

Теперь давайте создадим маршрут, позволяющий пользователям регистрироваться в API авторов через имя пользователя и пароль, как показано ниже..

Снова откройте файл app.py внутри виртуальной среды и вставьте следующий код под функцию token_required (f).

@ app.route (‘/ register’, method = [‘GET’, ‘POST’])
def signup_user ():
data = request.get_json ()

hashed_password = generate_password_hash (data [‘password’], method = ‘sha256’)

new_user = Users (public_id = str (uuid.uuid4 ()), name = data [‘name’], password = hashed_password, admin = False)
db.session.add (new_user)
db.session.commit ()

return jsonify ({‘message’: ‘успешно зарегистрирован’})

Внутри виртуальной среды создайте еще один маршрут в файле app.py, чтобы разрешить зарегистрированным пользователям входить в систему..

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

Вставьте код ниже предыдущего маршрута, который мы создали.

@ app.route (‘/ login’, method = [‘GET’, ‘POST’])
def login_user ():

auth = request.authorization

если не auth или не auth.username или не auth.password:
return make_response (‘не удалось проверить’, 401, {‘WWW.Authentication’: ‘Основная область: "требуется логин"«})

user = Users.query.filter_by (name = auth.username) .first ()

if check_password_hash (user.password, auth.password):
token = jwt.encode ({‘public_id’: user.public_id, ‘exp’: datetime.datetime.utcnow () + datetime.timedelta (minutes = 30)}, app.config [‘SECRET_KEY’])
return jsonify ({‘token’: token.decode (‘UTF-8’)})

return make_response (‘не удалось проверить’, 401, {‘WWW.Authentication’: ‘Основная область: "требуется логин"«})

Тем не менее, в виртуальной среде создайте другой маршрут в файле app.py для получения или получения всех зарегистрированных пользователей..

Этот код проверяет всех зарегистрированных пользователей в таблице «Пользователи» и возвращает окончательный результат в формате JSON..

Вставьте код ниже под маршрутом входа

@ app.route (‘/ users’, method = [‘GET’])
def get_all_users ():

users = Users.query.all ()

результат = []

для пользователя в пользователях:
user_data = {}
user_data [‘public_id’] = user.public_id
user_data [‘name’] = user.name
user_data [‘password’] = user.password
user_data [‘admin’] = user.admin

result.append (user_data)

вернуть jsonify ({‘users’: result})

Создать маршруты для таблицы авторов 

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

Только пользователи с действительными токенами могут выполнять эти операции API.

Внутри файла app.py создайте маршрут для зарегистрированных пользователей для создания новых авторов..

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

@ app.route (‘/ author’, method = [‘POST’, ‘GET’])
@token_required
def create_author (current_user):

data = request.get_json ()

new_authors = Авторы (имя = данные [‘имя’], страна = данные [‘страна’], книга = данные [‘книга’], booker_prize = True, user_id = current_user.id)
db.session.add (new_authors)
db.session.commit ()

return jsonify ({‘message’: ‘новый автор создан’})

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

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

@ app.route (‘/ авторы’, методы = [‘POST’, ‘GET’])
@token_required
def get_authors (current_user):

авторы = Authors.query.filter_by (user_id = current_user.id) .all ()

выход = []
для автора в авторах:

author_data = {}
author_data [‘name’] = author.name
author_data [‘book’] = author.book
author_data [‘country’] = author.country
author_data [‘booker_prize’] = author.booker_prize
output.append (author_data)

вернуть jsonify ({‘list_of_authors’: output})

Наконец, по-прежнему внутри файла app.py создайте маршрут для удаления указанного автора, как показано ниже.

Вставьте этот код под маршрут, который позволяет пользователю получить список авторов.

@ app.route (‘/ авторы /’, методы = [‘УДАЛИТЬ’])
@token_required
def delete_author (current_user, author_id):
author = Author.query.filter_by (id = author_id, user_id = current_user.id) .first ()
если не автор:
return jsonify ({‘message’: ‘автор не существует’})

db.session.delete (автор)
db.session.commit ()

return jsonify ({‘message’: ‘Автор удален’})

если __name__ == ‘__main__’:
app.run (отлаживать = True)

После этого сохраните и закройте файл app.py внутри виртуальной среды..

Тестирование API библиотеки с почтальоном

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

Помимо почтальона, мы можем использовать другие инструменты, такие как Curl отправлять запросы на сервер.

Откройте новый терминал и введите следующее:

почтальон

Команда почтальон заставит ваш веб-браузер отобразить страницу ниже:

postman_signup

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

Проверьте API библиотеки

В этом разделе мы позволим пользователю зарегистрироваться для API библиотеки, предоставив имя пользователя и уникальный пароль в формате JSON с помощью метода POST, выполнив следующие шаги:

  • Нажмите на вкладку с надписью Тело
  • Затем нажмите кнопку raw и выберите формат JSON.
  • введите имя пользователя и пароль для регистрации, как показано на скриншоте
  • Рядом с кнопкой отправки вставьте следующий URL-адрес http://127.0.0.1/register
  • Наконец, измените метод на POST и нажмите кнопку отправки.

пользователь регистрируется для API

Он будет отображать следующий вывод, как показано ниже:

Теперь мы успешно зарегистрировали пользователя. Давайте позволим пользователю, который только что зарегистрировался, войти в систему, чтобы сгенерировать временный случайный токен, для доступа к таблице авторов, выполнив следующие шаги:

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

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

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

В этом разделе мы добавим информацию об авторе в таблицу авторов с помощью метода POST, выполнив следующие шаги:

  • Нажмите на вкладку заголовков
  • Включите следующие заголовки HTTP, показанные на скриншоте

  • Далее нажмите на вкладку тела и введите данные нового автора
  • Затем нажмите кнопку отправки, чтобы добавить сведения об авторе в таблицу авторов.

Вы также можете получить информацию об авторах в таблице авторов с помощью следующего:

  • Убедитесь, что ваш сгенерированный токен находится в разделе заголовков. если его там нет, вам нужно заполнить его токеном.
  • Рядом с кнопкой отправки введите этот URL http://127.0.0.1/authors
  • Затем измените метод HTTP на GET и нажмите кнопку отправки, чтобы получить сведения об авторах.

Наконец, вы можете удалить автора (ов) в таблице «Авторы» с помощью метода DELETE, выполнив следующие шаги:

  • Убедитесь, что ваш токен все еще находится в разделе заголовков. Вы можете проверить вкладку заголовков, чтобы убедиться в наличии необходимой информации.
  • Рядом с кнопкой отправки введите этот URL http://127.0.0.1/sam
  • Затем нажмите кнопку отправки, чтобы удалить пользователя, которого вы указали.

Вы можете найти полный исходный код на Github.  Вы можете клонировать его и проверить на своей машине.

TAGS:

  • питон

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map