Com assegurar una API de flask REST amb token web JSON?

Anem a aprendre a protegir una API REST amb fitxes web JSON per evitar que els usuaris i les aplicacions de tercers puguin abusar-ne.


Crearem un servei de base de dades utilitzant SQLite i permetre als usuaris accedir-hi mitjançant una API REST mitjançant mètodes HTTP com POST i PUT.

A més, coneixerem per què els fitxes web JSON són una forma adequada de protegir l’API de repòs en lloc de l’autenticació i l’autenticació bàsica. Abans de continuar, entenem el terme fitxes web JSON, API REST i marc de flascons.

Tokens web JSON

Testimoni web de JSON, també conegut com a JWT, és la forma segura de transferir fitxes aleatòries entre dues parts o entitats. El JSON sol estar format per tres parts de la següent.

  • Càrrega útil
  • Capçalera
  • Signatura

JSON utilitza dos tipus de formularis d’estructura per transferir dades o informació entre dues parts.

  • Serialitzat
  • Deserialitzat

El formulari serialitzat s’utilitza per transferir dades a la xarxa a través de cada sol·licitud i resposta, mentre que el formulari deserialitzat s’utilitza per llegir i escriure dades al testimoni web..

En la forma serialitzada, hi ha tres components.

  • Capçalera
  • Càrrega útil
  • Signatura

El component de capçalera defineix la informació criptogràfica sobre els testimonis. Per exemple:

  • JWT està signat o no signat?
  • Definiu tècniques d’algoritmes

La forma deserialitzada, a diferència de la forma serialitzada, conté dos components.

  • Càrrega útil
  • Capçalera

API de REST

L’API (interfície de programació d’aplicacions) permet la comunicació entre dues aplicacions per recuperar o enviar les dades. Hi ha dos tipus populars d’API: web i API del sistema.

En aquest article, només mirarem l’API web. Hi ha dos tipus d’API web.

  • Sol·licitud – API de resposta: Rest, GraphQL, trucada de procediment remot (RPC)
  • API basada en esdeveniments: WebHooks, Web Sockets, streaming de HTTP

L’API REST es troba dins de la categoria de sol·licitud-resposta. Utilitza mètodes HTTP com GET, POST i PUT per realitzar operacions d’API.

Un exemple clàssic és quan un usuari envia un mètode GET al servei web per sol·licitar o recuperar un recurs específic o una col·lecció de recursos. El servidor torna a enviar el recurs o la col·lecció de recursos específics a l’usuari que ho ha sol·licitat.

Marc de matràs

El matràs és un marc basat en el pitó. És un micro-marc utilitzat pels desenvolupadors de python per crear API de descans. S’anomena micro framework perquè permet als desenvolupadors, per exemple, afegir autenticació personalitzada i qualsevol altre sistema de backend basat en preferències.

Comencem amb la implementació. La meva configuració del sistema és la següent.

  • Ubuntu com a sistema operatiu
  • Python 2.7+
  • Carter

Configura un entorn virtual mitjançant virtualenv

Hem de configurar un entorn virtual per assegurar-nos que alguns paquets no entraran en conflicte amb els paquets del sistema. Utilitzem virtualenv per configurar un nou entorn virtual.

Si suposem que teniu la comanda pip disponible al vostre sistema, executeu la següent comanda mitjançant pip per instal·lar.

pip install virtualenv

Si no teniu pip al vostre equip, seguiu-lo documentació per instal·lar pip al vostre sistema.

A continuació, creem un directori per emmagatzemar o mantenir el nostre entorn virtual. Utilitzeu la comanda mkdir que es mostra a continuació per crear un directori

flaskproject de mkdir

Podeu canviar al directori de flaskproject mitjançant la següent comanda

cd flaskproject

Dins del directori de flaskproject, utilitzeu l’eina virtualenv per crear un entorn virtual com es mostra a continuació:

virtualenv flaskapi

Després d’haver utilitzat l’eina virtualenv per crear l’entorn virtual, executeu l’ordre cd per canviar al directori de flaskapi com a entorn virtual i activeu-lo mitjançant la comanda següent.

bin binador / activar

Executeu totes les tasques relacionades amb aquest projecte dins de l’entorn virtual.

Instal·leu paquets mitjançant pip

Ara és el moment d’instal·lar paquets com el framework de matràs i PyJWT que utilitzarem per crear l’API de resta i altres paquets necessaris per al nostre projecte API..

Creeu un fitxer requisits.txt amb els paquets següents.

Matràs
data i hora
uuid
Flask-SQLAlchemy
PyJWT

Instal·leu-les amb pip.

pip install -rrequisits.txt

Configurar una base de dades

Instal·lem SQLite.

apt-get install sqlite3

Creeu una base de dades anomenada biblioteca. Dins d’aquesta base de dades, crearem dues taules, concretament la taula Usuaris i Autors.

La taula d’usuaris contindrà usuaris registrats. Només els usuaris registrats poden tenir accés a la taula Autors.

La taula d’autors emmagatzemarà informació o detalls dels autors, com ara el nom de l’autor, el país de naixement, etc. entregats pels usuaris registrats.

Creeu la base de dades mitjançant la següent comanda:

sqlite3 library.db

Podeu comprovar si heu creat la base de dades amb èxit mitjançant la següent comanda:

.bases de dades

Obriu un nou terminal i executeu el següent a l’entorn virtual que hem creat anteriorment.

toca app.py

Enganxeu el codi següent dins del fitxer anomenat app.py

des de la importació de matràs Flask, request, jsonify, make_response
des de flask_sqlalchemy importació SQLAlchemy
des de werkzeug.security import generate_password_hash, check_password_hash
importar uuid
importació jwt
importar data d’hora
dels embolcalls d’importació de funcions

La primera línia del codi anterior importa paquets com ara request i jsonify. Farem ús de la sol·licitud per fer un seguiment de les dades al nivell de la sol·licitud durant una sol·licitud i farem servir jsonify per produir respostes en un JSON format.

A la línia següent, vam importar SQLAlchemy de flask_sqlalchemy per integrar les funcions de SQLAlchemy al matràs.

Des de werkzeug.security, vam importar generate_password_hash per generar hash de contrasenya per als usuaris i check_password_hash per comprovar la contrasenya de l’usuari quan es compara la contrasenya enviada pels usuaris amb les contrasenyes dels usuaris emmagatzemades a la base de dades..

Finalment, vam importar uuid també coneguts com identificadors únics universals per generar números d’identificació aleatoris per als usuaris.

Tot i així, dins del fitxer app.py, implementeu els paràmetres de configuració per a l’API de la biblioteca mitjançant el codi següent dins del fitxer app.py.

Poseu el codi següent a la instrucció d’importació.

app = Matràs (__ nom__)

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 (aplicació)

Ara creeu dos models per a la taula Usuaris i Autors com es mostra a continuació. Copieu i enganxeu el codi al fitxer app.py.

Col·loqueu el codi que hi ha a sota mateix d’aquesta configuració de base de dades db = SQLAlchemy (app)

Usuaris de la classe (db.Model):
id = db.Column (db.Integer, main_key = True)
public_id = db.Column (db.Integer)
nom = db.Column (cadena db.String (50))
contrasenya = db.Column (db.String (50))
administrador = db.Column (db.Boolean)
Autors de classe (db.Model):
id = db.Column (db.Integer, main_key = True)
name = db.Column (db.String (50), unique = 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)

Genereu taules d’usuaris i autors

Al terminal, escriviu el codi següent dins de l’entorn virtual per generar o crear taules tant per a les taules d’Usuaris com d’Autors com es mostra a continuació

de la importació d’aplicacions db
db.create_all ()

Després, obriu el fitxer app.py dins de l’entorn virtual i creeu una altra funció.

Aquesta funció generarà fitxes per tal de permetre als usuaris registrats només accedir i realitzar un conjunt d’operacions de l’API contra la taula Autors.

Situeu aquest codi a sota del model de base de dades de la taula Autors

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

testimoni = Cap

si ‘x-access-tokens’ a request.headers:
token = request.headers [‘x-access-tokens’]

si no és testimoni:
retornar jsonify ({‘message’: “falta un testimoni vàlid”})

proveu:
data = jwt.decode (token, app.config [SECRET_KEY])
current_user = Users.query.filter_by (public_id = data [‘public_id’]). primer ()
excepte:
retornar jsonify ({“message”: “el testimoni no és vàlid”})

retornar f (actual_user, * args, ** kwargs)
retornador decorador

Crear rutes per a la taula d’usuaris

Ara creem una ruta per permetre als usuaris registrar-se a l’API d’Autors mitjançant un nom d’usuari i una contrasenya com es mostra a continuació.

Obriu de nou el fitxer app.py dins de l’entorn virtual i enganxeu el codi següent a la funció token_required (f)

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

hashed_password = generar_password_hash (dades [‘contrasenya’], mètode = ‘sha256’)

new_user = Usuaris (public_id = str (uuid.uuid4 ()), nom = dades [‘nom’], contrasenya = hashed_password, admin = False)
db.session.add (new_user)
db.session.commit ()

retornar jsonify ({‘message’: ‘registrat amb èxit’})

A l’entorn virtual, creeu una altra ruta al fitxer app.py per permetre als usuaris registrats iniciar sessió.

Quan un usuari inicia la sessió, es genera un testimoni aleatori perquè l’usuari accedeixi a l’API de la biblioteca.

Enganxeu el codi que hi ha a sota de la ruta anterior que vam crear.

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

auth = request.authorization

si no és auth o no auth.username o no auth.password:
tornar make_response (“no s’ha pogut verificar”, 401, {“WWW.Authentication”: “Àmbit bàsic: "cal iniciar sessió"’})

user = Users.query.filter_by (nom = nom auth.us) .first ()

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

tornar make_response (“no s’ha pogut verificar”, 401, {“WWW.Authentication”: “Àmbit bàsic: "cal iniciar sessió"’})

Tot i així, dins de l’entorn virtual, creeu una altra ruta al fitxer app.py per obtenir o recuperar tots els usuaris registrats.

Aquest codi comprova tots els usuaris registrats a la taula Usuaris i retorna el resultat final en format JSON.

Enganxeu el codi que hi ha a sota de la ruta d’inici de sessió

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

users = Users.query.all ()

resultat = []

per a usuaris en usuaris:
user_data = {}
user_data [‘public_id’] = user.public_id
user_data [‘nom’] = nom d’usuari
user_data [‘password’] = user.password
user_data [‘admin’] = user.admin

result.append (user_data)

tornar jsonify ({‘usuaris’: resultat})

Crear rutes per a la taula d’autors 

Creem rutes per a la taula Autors per permetre als usuaris recuperar tots els autors de la base de dades, i eliminar els autors.

Només els usuaris amb fitxes vàlides poden realitzar aquestes operacions de l’API.

Dins del fitxer app.py, creeu una ruta per als usuaris registrats per crear nous autors.

Enganxeu aquest codi a la ruta que permet recuperar a tots els usuaris registrats.

@ app.route (‘/ autor’, méthodes = [‘POST’, ‘GET’])
@token_required
def create_author (actual_user):

data = request.get_json ()

new_authors = Autors (nom = dades [‘nom’], país = dades [‘país’], llibre = dades [‘llibre’], booker_prize = True, user_id = current_user.id)
db.session.add (nous_autors)
db.session.commit ()

tornar jsonify ({‘message’: ‘nou autor creat’})

A continuació, creeu una altra ruta per permetre a un usuari registrat amb un testimoni vàlid recuperar tots els autors de la taula Autors com es mostra a continuació.

Enganxeu aquest codi per sota de la ruta que permet a un usuari crear un nou autor.

@ app.route (‘/ autors’, method = [‘POST’, ‘GET’])
@token_required
def get_authors (actual_user):

autors = Authors.query.filter_by (user_id = current_user.id) .all ()

sortida = []
per a autors en autors:

author_data = {}
autor_data [‘nom’] = nom d’autor
author_data [‘book’] = author.book
author_data [‘country’] = author.country
author_data [‘booker_prize’] = author.booker_prize
output.append (autor_data)

retornar jsonify ({‘llista_dels_autors’: sortida})

Finalment, encara dins del fitxer app.py, creeu una ruta per eliminar un autor especificat com es mostra a continuació.

Enganxeu aquest codi a la ruta que permet a l’usuari recuperar una llista d’autors.

@ app.route (‘/ autors /’, méthodes = [‘DELETE’])
@token_required
def delete_author (actual_user, author_id):
author = Author.query.filter_by (id = author_id, user_id = current_user.id) .first ()
si no és autor:
tornar jsonify ({‘message’: ‘L’autor no existeix’})

db.session.delete (autor)
db.session.commit ()

tornar jsonify ({‘message’: ‘Autor suprimit’})

si __name__ == “__main__”:
app.run (debug = True)

Després, deseu i tanqueu el fitxer app.py dins de l’entorn virtual.

Prova de l’API de biblioteca amb Postman

En aquesta secció, farem ús d’una eina de carter per enviar una sol·licitud als serveis de la base de dades. Si no teniu cap carter a la vostra màquina, podreu esbrinar com descarregar-lo i instal·lar-lo aquí.

A part del carter, podem fer ús d’altres eines com ara Rínxol per enviar sol·licituds al servidor.

Obriu un nou terminal i escriviu el següent:

carter

El carter de comandaments farà que el vostre navegador web mostri la pàgina següent:

postman_signup

Podeu decidir registrar-vos i crear un compte gratuït, però omirem i accedirem directament a l’aplicació per provar l’API de la biblioteca com es mostra a continuació:

Prova l'api de la biblioteca

En aquesta secció, permetrem que l’usuari es registri a l’API de la biblioteca proporcionant un nom d’usuari i una contrasenya única en un format JSON mitjançant el mètode POST mitjançant els passos següents:

  • Feu clic a la pestanya etiquetada Cos
  • A continuació, seleccioneu el botó en brut i escolliu el format JSON
  • introduïu un nom d’usuari i una contrasenya per registrar-se tal com es mostra a la captura de pantalla
  • Al costat del botó d’enviament, inseriu la següent URL http://127.0.0.1/register
  • Finalment, canvieu el mètode a POST i premeu el botó d’enviament.

un usuari es registra en una api

Es mostrarà la sortida següent com es mostra a continuació:

Ara hem registrat un usuari correctament. Anem a l’hora de permetre a l’usuari que s’acaba de registrar per iniciar la sessió per tal de generar un testimoni aleatori temporal per accedir a la taula Autors mitjançant els passos següents:

  •  Feu clic a la pestanya d’autorització.
  • A la secció Tipus, seleccioneu autenticació bàsica.
  • A continuació, ompliu el formulari d’usuari i contrasenya amb el nom d’usuari i la contrasenya amb els que vau registrar anteriorment.
  • Finalment, premeu el botó d’enviament per iniciar la sessió i generar un testimoni aleatori.

Una vegada que l’usuari accedeixi amb èxit, es genera un testimoni aleatori per a l’usuari tal com es mostra a la captura de pantalla.

Utilitzarem el testimoni aleatori generat per accedir a la taula Autors.

En aquesta secció, afegirem la informació d’un autor a la taula Autors mitjançant el mètode POST mitjançant els passos següents:

  • Feu clic a la pestanya Capçaleres
  • Incloeu les capçaleres HTTP següents que es mostren a la captura de pantalla

  • A continuació, feu clic a la pestanya Cos i introduïu els detalls del nou autor
  • A continuació, premeu el botó d’enviament per afegir les dades de l’autor a la taula de l’autor

També podeu recuperar la informació dels autors a la taula Autors mitjançant el següent:

  • Assegureu-vos que el token generat es trobi a la secció de capçaleres. si no hi és, heu d’omplir-lo amb el vostre testimoni.
  • Al costat del botó d’enviament, introduïu aquest URL http://127.0.0.1/authors
  • A continuació, canvieu el mètode HTTP a GET i premeu el botó d’enviament per recuperar els detalls dels autors.

Finalment, podeu suprimir els autors a la taula Autors mitjançant el mètode DELETE mitjançant els passos següents:

  • Assegureu-vos que el vostre testimoni es troba encara a la secció de capçaleres. Podeu consultar la fitxa de capçaleres per assegurar-vos que hi ha la informació necessària.
  • Al costat del botó d’enviament, introduïu aquest URL http://127.0.0.1/sam
  • A continuació, premeu el botó d’envia per eliminar l’usuari que heu especificat.

Podeu trobar el codi font complet a Github.  Podeu clonar-la i comprovar-la a la vostra màquina.

Tags:

  • Python

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