Как да защитим Flask REST API с JSON Web Token?

Нека научим как да защитим API на REST с уеб маркери JSON, за да не допуснем злоупотребата с потребителите и приложенията на трети страни..


Ще изградим услуга на база данни, използвайки SQLite и позволяват на потребителите да получат достъп до него чрез REST API, използвайки HTTP методи като POST и PUT.

В допълнение ще се запознаем защо уеб маркерите на JSON са подходящ начин за защита на API за почивка вместо дайджест и основна идентификация. Преди да продължим, нека разберем термина JSON уеб маркери, REST API и Flask Framework.

JSON уеб токени

JSON web token, известен също като JWT, е сигурният начин за прехвърляне на произволни маркери между две страни или образувания. JSON обикновено се състои от три части, както следва.

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

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

  • серийни номера
  • Deserialized

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

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

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

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

  • Дали е подписан или неподписан JWT?
  • Определете техники за алгоритъм

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

  • полезен товар
  • удар с глава

REST API

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

В тази статия ще разгледаме само уеб API. Има два типа уеб API.

  • Заявка – API за отговор: почивка, GraphQL, извикване на отдалечена процедура (RPC)
  • API, управляван от събития: WebHooks, Web Sockets, HTTP Streaming

REST API попада в категорията на заявката-отговор. Използва HTTP методи като GET, POST и PUT за извършване на API операции.

Класически пример е, когато потребителят изпраща GET метод на уеб услугата, за да поиска или извлече определен ресурс или колекция от ресурси. След това сървърът изпраща обратно конкретния ресурс или колекция от ресурси обратно на потребителя, който го е поискал.

Рамка на колбата

Flask е рамка, базирана на python. Това е микро-рамка, използвана от разработчиците на python за изграждане на API за почивка. Нарича се микро рамка, защото позволява на разработчиците например да добавят персонализирана идентификация и всяка друга резервна система въз основа на предпочитанията.

Нека започнем с внедряването. Настройката на системата ми е следната.

  • Ubuntu като ОС
  • Python 2.7+
  • пощаджия

Създайте виртуална среда с помощта на virtualenv

Трябва да създадем виртуална среда, за да гарантираме, че някои пакети няма да са в конфликт със системните пакети. Нека използваме virtualenv за създаване на нова виртуална среда.

Ако приемем, че pip командата е налична на вашата система, изпълнете следната команда чрез pip, за да инсталирате.

пип инсталиране virtualenv

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

След това нека създадем директория, която да съхранява или съхранява нашата виртуална среда. Използвайте командата mkdir, показана по-долу, за да създадете директория

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

Променете в директорията flaskproject, като използвате следната команда

cd flaskproject

В директорията на flaskproject използвайте инструмента virtualenv, за да създадете виртуална среда, както е показано по-долу:

virtualenv flaskapi

След като сте използвали инструмента virtualenv за създаване на виртуалната среда, стартирайте командата cd, за да се промените в директорията flaskapi като виртуална среда и я активирайте с помощта на командата по-долу.

източник кош / активиране

Изпълнете всички задачи, свързани с този проект, във виртуалната среда.

Инсталирайте пакети с помощта на pip

Сега е време да инсталирате пакети като флаш рамката и PyJWT, които ще използваме за изграждането на останалите API и други необходими пакети за нашия проект за API.

Създайте файл request.txt със следните пакети.

Колба
Време за среща
UUID
Flask-SQLAlchemy
PyJWT

Инсталирайте ги с пип.

pip install -r изисквания.txt

Създаване на база данни

Нека да инсталираме SQLite.

apt-get install sqlite3

Създайте база данни с име библиотека. Вътре в тази база данни ще създадем две таблици, а именно таблицата „Потребители и автори“.

Таблицата на потребителите ще съдържа регистрирани потребители. Само регистрираните потребители могат да имат достъп до таблицата с автори.

Таблицата с автори ще съхранява информация или подробности за авторите, като име на автора, държава на раждане и така нататък, предоставена от регистрираните потребители.

Създайте базата данни с помощта на следната команда:

sqlite3 library.db

Можете да проверите дали успешно сте създали базата данни, като използвате командата по-долу:

.бази данни

Отворете нов терминал и изпълнете следното във виртуалната среда, която създадохме по-рано.

докоснете app.py

Поставете следния код във файла с име app.py

от внос на колба Колба, заявка, jsonify, make_response
от flask_sqlalchemy import SQLAlchemy
от werkzeug.security import origin_password_hash, check_password_hash
import uuid
import jwt
време за импортиране
от функтоли за внос на обвивки

Първият ред в кода по-горе импортира пакети като заявка и jsonify. Ще използваме заявката, за да следим данните на ниво заявка по време на заявка и ще използваме jsonify за извеждане на отговори в JSON формат.

На следващия ред импортирахме SQLAlchemy от flask_sqlalchemy, за да интегрираме SQLAlchemy функциите в колбата.

От werkzeug.security импортирахме create_password_hash, за да генерираме хеш на паролата за потребителите и check_password_hash, за да проверим паролата на потребителя, когато сравняваме паролата, подадена от потребителите с паролите на потребителите, съхранявани в базата данни.

И накрая, импортирахме uuid, известен още като универсални уникални идентификатори за генериране на случайни идентификационни номера за потребителите.

И все пак вътре в app.py файла реализирайте настройките за конфигурация за API на библиотеката, като използвате кода по-долу във файла app.py.

Поставете следния код под декларацията за импортиране.

ап = колба (__ име__)

app.config [ ‘SECRET_KEY’] = ‘Th1s1ss3cr3t “
app.config [ ‘SQLALCHEMY_DATABASE_URI’] = ‘SQLite: /////home/michael/geekdemos/geekapp/library.db “
app.config [‘SQLALCHEMY_TRACK_MODIFICATIONS’] = Вярно

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

Сега създайте два модела за таблицата „Потребители и автори“, както е показано по-долу. Копирайте и поставете кода във файла app.py.

Поставете кода по-долу точно под тази настройка на базата данни db = SQLAlchemy (приложение)

Потребители от клас (db.Model):
id = db.Column (db.Integer, basic_key = True)
public_id = db.Column (db.Integer)
име = db.колона (db.String (50))
парола = db.колона (db.String (50))
admin = db.Column (db.Boolean)
Автори на класа (db.Model):
id = db.Column (db.Integer, basic_key = True)
име = db.Column (db.String (50), уникален = True, nullable = False))
книга = db.Column (db.String (20), уникален = True, nullable = False))
страна = db.Column (db.String (50), nullable = False))
booker_prize = db.Column (db.Boolean)

Генериране на таблици на потребители и автори

На терминала въведете следния код във виртуалната среда, за да генерирате или създавате таблици както за таблиците Потребители, така и за Автори, както е показано по-долу

от внос на приложения db
db.create_all ()

След това отворете файла app.py във виртуалната среда и създайте друга функция.

Тази функция ще генерира маркери, за да позволи на само регистрирани потребители да имат достъп и да извършват набор от операции на API срещу таблицата с авторите.

Поставете този код под модела на базата данни за таблицата с авторите

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

токен = Няма

ако ‘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’: ‘маркерът е невалиден’})

връщане f (current_user, * args, ** kwargs)
връщане декоратор

Създайте маршрути за таблицата на потребителите

Сега нека създадем маршрут, за да позволим на потребителите да се регистрират за Авторите API чрез потребителско име и парола, както е показано по-долу.

Отново отворете app.py файла във виртуалната среда и поставете следния код под функцията token_required (f)

@ app.route (‘/ регистрирай се, методи = [‘ GET ‘,’ POST ‘])
def signup_user ():
data = request.get_json ()

hashed_password = create_password_hash (данни [‘парола’], метод = ‘sha256’)

new_user = Потребители (public_id = str (uuid.uuid4 ()), name = data [‘name’], password = hashed_password, admin = False)
db.session.add (new_user)
db.session.commit ()

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

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

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

Поставете кода по-долу под предишния маршрут, който създадохме.

@ app.route (‘/ влизане’, методи = [‘GET’, ‘POST’])
def login_user ():

auth = request.authorization

ако не auth или не auth.username или не auth.password:
връщане make_response (‘не можа да провери’, 401, {‘WWW.Authentication’: ‘Основна област: "задължително влизане"’})

потребител = Users.query.filter_by (име = auth.username) .first ()

ако check_password_hash (user.password, auth.password):
token = jwt.encode ({‘public_id’: user.public_id, ‘exp’: datetime.datetime.utcnow () + datetime.timedelta (минути = 30)}, app.config [‘SECRET_KEY’])
върнете jsonify ({‘token’: token.decode (‘UTF-8’)})

връщане make_response (‘не можа да провери’, 401, {‘WWW.Authentication’: ‘Основна област: "задължително влизане"’})

Все пак, във виртуалната среда, създайте друг маршрут във файла app.py, за да получите или извлечете всички регистрирани потребители.

Този код проверява за всички регистрирани потребители в таблицата с потребители и връща крайния резултат във формат JSON.

Поставете кода по-долу под маршрута за влизане

@ app.route (‘/ потребители’, методи = [‘GET’])
def get_all_users ():

users = Users.query.all ()

резултат = []

за потребител в потребители:
user_data = {}
user_data [‘public_id’] = user.public_id
user_data [‘име’] = user.name
user_data [‘password’] = user.password
user_data [‘admin’] = user.admin

result.append (user_data)

върнете jsonify ({‘потребители’: резултат})

Създайте маршрути за таблицата с авторите 

Нека създадем маршрути за таблицата с автори, за да позволим на потребителите да извличат всички автори в базата данни, както и да изтриват авторите.

Само потребители с валидни маркери могат да извършват тези операции с API.

Вътре в файла app.py създайте маршрут за регистрирани потребители, за да създадат нови автори.

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

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

data = request.get_json ()

new_authors = Автори (име = данни [‘име’], държава = данни [‘държава’], книга = данни [‘книга’], booker_prize = Вярно, 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 [‘име’] = автор.име
author_data [‘книга’] = author.book
author_data [‘държава’] = author.country
author_data [‘booker_prize’] = author.booker_prize
output.append (author_data)

върнете jsonify ({‘list_of_authors’: изход})

И накрая, все още във файла app.py създайте маршрут за изтриване на определен автор, както е показано по-долу.

Поставете този код под маршрута, който позволява на потребителя да извлече списък с автори.

@ app.route (‘/ автори /’, методи = [‘DELETE’])
@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 ()

връщане jsonify ({‘message’: ‘Автор е изтрит’})

ако __name__ == ‘__main__’:
app.run (отстраняване на грешки = True)

След това запазете и затворете файла app.py във виртуалната среда.

Тестване на API на библиотеката с Postman

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

Освен пощальона, можем да се възползваме и от други инструменти като Къдрица за изпращане на заявки до сървъра.

Отворете нов терминал и въведете следното:

пощаджия

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

postman_signup

Можете да решите да се регистрирате и да създадете безплатен акаунт, но ние ще пропуснем и ще получите директен достъп до приложението, за да тестваме API на библиотеката, както е показано по-долу:

Тествайте библиотеката api

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

  • Кликнете върху раздела с надпис Body
  • След това изберете суровия бутон и изберете формат 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.  Можете да го клонирате и да проверите на вашата машина.

ЕТИКЕТИ:

  • Питон

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