Kako osigurati Flask REST API s JSON Web Tokenom?

Naučimo kako osigurati REST API putem JSON web tokena kako bi se spriječilo da korisnici i aplikacije trećih strana zloupotrebe.


Izgradit ćemo uslugu baze podataka koristeći SQLite i omogućiti korisnicima da mu pristupaju putem REST API-ja primjenom HTTP metoda kao što su POST i PUT.

Uz to, upoznat ćemo i zašto su JSON web tokeni prikladan način zaštite API-ja za odmor umjesto davanja i osnovne autentičnosti. Prije nego što nastavimo, razumjet ćemo pojam JSON web tokena, REST API i Flask frame.

JSON web tokeni

JSON web token, također poznat kao JWT, je siguran način prijenosa nasumičnih tokena između dviju strana ili entiteta. JSON se obično sastoji od tri dijela kao što slijedi.

  • korisna nosivost
  • Zaglavlje
  • Potpis

JSON koristi dvije vrste strukturalnih oblika prilikom prijenosa podataka ili informacija između dviju strana.

  • serijaliziranom
  • Deserialized

Serijalizirani obrazac koristi se pri prijenosu podataka na mrežu putem svakog zahtjeva i odgovora, dok se deserializirani obrazac koristi pri čitanju i pisanju podataka u web token.

U serializiranom obliku postoje tri komponente.

  • Zaglavlje
  • korisna nosivost
  • Potpis

Komponenta zaglavlja definira kriptografske podatke o tokenima. Na primjer:

  • Je li potpisan ili nepodpisan JWT?
  • Definirajte tehnike algoritma

Deserializirani oblik, za razliku od serializiranog oblika, sadrži dvije komponente.

  • korisna nosivost
  • Zaglavlje

REST API

API (programsko sučelje programiranja) omogućuje komunikaciju između dvije aplikacije za dohvaćanje ili dostavljanje podataka. Postoje dvije popularne vrste API-ja – web i sistemski API.

U ovom ćemo članku pogledati samo web API. Postoje dvije vrste web API-ja.

  • Zahtjev – API odgovora: Odmor, GraphQL, Poziv na daljinski postupak (RPC)
  • Event-driven API: WebHooks, Web Sockets, HTTP Streaming

REST API spada pod kategoriju zahtjev-odgovor. Za obavljanje API operacija koristi HTTP metode kao što su GET, POST i PUT.

Klasičan primjer je kada korisnik šalje GET metodu internetskoj usluzi da zatraži ili preuzme određeni resurs ili zbirku resursa. Poslužitelj zatim vraća određeni resurs ili zbirku resursa nazad korisniku koji ga je zatražio.

Flask Framework

Flask je okvir zasnovan na pitonu. To je mikro-okvir koji koriste programeri python-a za izgradnju API-ja za odmor. Nazvan je mikro okvirom jer omogućuje, primjerice, programerima da dodaju prilagođenu provjeru autentičnosti i bilo koji drugi sigurnosni sustav na temelju preferencija.

Započnimo s implementacijom. Moja instalacija sustava je sljedeća.

  • Ubuntu kao OS
  • Python 2.7+
  • Poštar

Postavite virtualno okruženje pomoću virtualenv

Moramo postaviti virtualno okruženje kako bi se osiguralo da neki paketi neće biti u sukobu s sistemskim paketima. Upotrijebimo virtualenv za postavljanje novog virtualnog okruženja.

Pod pretpostavkom da vam je naredba pip dostupna na vašem sustavu, pokrenite sljedeću naredbu putem pip-a za instalaciju.

pip instalirati virtualenv

Ako nemate pips na svom računalu, slijedite ovo dokumentacija instalirati pip na svoj sustav.

Zatim stvorimo direktorij za pohranu ili zadržavanje našeg virtualnog okruženja. Za izradu mape upotrijebite naredbu mkdir, prikazanu dolje

mkdir flaškaprojekt

Promijenite u imenik flaskproject sljedeću naredbu

cd flaškaprojekt

Unutar direktorij flaskproject, pomoću virtualenv alata stvorite virtualno okruženje kao što je prikazano u nastavku:

virtualenv flaskapi

Nakon što ste pomoću virtualenv alata stvorili virtualno okruženje, pokrenite naredbu cd da biste se promijenili u direktorij flaskapi kao virtualno okruženje i aktivirajte je pomoću naredbe u nastavku.

izvorni kanti / aktivirati

Izvršite sve zadatke povezane s ovim projektom u virtualnom okruženju.

Instalirajte pakete pomoću pip-a

Sada je vrijeme za instaliranje paketa kao što su flok Framework i PyJWT koji ćemo koristiti za izgradnju ostalog API-ja i ostalih potrebnih paketa za naš API projekt.

Napravite datoteku sa zahtevima.txt sa sljedećim paketima.

boca
Datum vrijeme
UUID
Tikvica-SQLAlchemy
PyJWT

Instalirajte ih pipovima.

pip install -r zahtjevi.txt

Postavljanje baze podataka

Instalirajmo SQLite.

apt-get install sqlite3

Stvorite bazu podataka pod nazivom biblioteka. Unutar ove baze podataka stvorit ćemo dvije tablice, odnosno tablicu korisnika i autora.

Tablica korisnika sadržavat će registrirane korisnike. Samo registrirani korisnici mogu imati pristup tablici autora.

Autorska tablica pohranit će podatke autora ili pojedinosti kao što su ime autora, zemlja rođenja itd. Koju dostavljaju registrirani korisnici.

Stvorite bazu podataka pomoću sljedeće naredbe:

sqlite3 library.db

Možete provjeriti jeste li uspješno stvorili bazu podataka pomoću naredbe u nastavku:

.baze podataka

Otvorite novi terminal i izvršite sljedeće u virtualnom okruženju koje smo kreirali ranije.

dodirnite app.py

Zalijepite sljedeći kôd unutar datoteke s imenom app.py

iz uvoza tikvice Boca, zahtjev, jsonify, make_response
iz uvoza flask_sqlalchemy SQLAlchemy
from werkzeug.security import create_password_hash, check_password_hash
import uuid
import jwt
uvozi datum
iz uvoznih omotača za functools

Prvi redak u kodu iznad uvozi pakete kao što su zahtjev i jsonify. Koristit ćemo zahtjev da pratimo podatke na razini zahtjeva tijekom zahtjeva i upotrijebit ćemo jsonify za izlazne odgovore u JSON format.

U sljedećem retku uvezli smo SQLAlchemy iz flask_sqlalchemy kako bismo integrirali SQLAlchemy značajke u tikvicu.

Iz werkzeug.security, uveli smo create_password_hash kako bismo generirali hash zaporke za korisnike i check_password_hash da bismo provjerili korisničku lozinku kada uspoređujemo lozinku koju su poslali korisnici s lozinkama korisnika pohranjenih u bazi podataka.

Konačno, uvezli smo uuid, također poznat kao univerzalni jedinstveni identifikator, za generiranje slučajnih ID brojeva za korisnike.

Ipak, unutar datoteke app.py implementirajte konfiguracijske postavke za API knjižnice koristeći kôd ispod u datoteci app.py.

Ispod uvoza izjave stavite sljedeći kôd.

app = Tikvica (__ name__)

app.config [ ‘SECRET_KEY’] = ‘Th1s1ss3cr3t’
app.config [ ‘SQLALCHEMY_DATABASE_URI’] = ‘SQLite: /////home/michael/geekdemos/geekapp/library.db’
app.config [‘SQLALCHEMY_TRACK_MODIFICATIONS’] = Točno

db = SQLAlhemija (aplikacija)

Sada stvorite dva modela za tablicu korisnika i autora kao što je prikazano u nastavku. Kopirajte i zalijepite kôd unutar datoteke app.py.

Stavite kôd ispod ispod ove baze podataka db = SQLAlchemy (aplikacija)

Korisnici klase (db.Model):
id = db.kolona (db.Integer, Primary_key = Istina)
public_id = db.Column (db.Integer)
ime = db.kolona (db.String (50))
lozinka = db.kolona (db.String (50))
admin = db.Column (db.Boolean)
Autori klase (db.Model):
id = db.kolona (db.Integer, Primary_key = Istina)
name = db.Column (db.String (50), jedinstveno = True, nullable = False))
knjiga = db.Column (db.String (20), jedinstven = True, nullable = False))
zemlja = db.kolona (db.String (50), nullable = netočno))
booker_prize = db. Column (db.Boolean)

Stvaranje tablica korisnika i autora

Na terminalu utipkajte sljedeći kôd unutar virtualnog okruženja kako biste generirali ili stvorili tablice za tablice korisnika i autora kao što je prikazano u nastavku

iz uvoza aplikacije db
db.create_all ()

Nakon toga otvorite datoteku app.py unutar virtualnog okruženja i stvorite drugu funkciju.

Ova će funkcija generirati tokene kako bi samo registriranim korisnicima omogućila pristup i izvršavanje skupa API operacija u tablici autora.

Stavite ovaj kôd ispod modela baze podataka u tablici Autori

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

token = nijedan

ako je “x-access-token” u request.headers:
token = request.headers [‘x-access-tokens’]

ako ne znak:
return jsonify ({‘message’: ‘nedostaje valjani token’})

probati:
data = jwt.decode (token, app.config [SECRET_KEY])
current_user = Users.query.filter_by (public_id = podaci [‘public_id’]). prvi ()
osim:
return jsonify ({‘message’: ‘žeton nije valjan’})

povratak f (current_user, * args, ** kwargs)
povratak stolisnik

Napravite rute za tablicu korisnika

Sada ćemo stvoriti rutu koja će omogućiti korisnicima da se registriraju za Autori API putem korisničkog imena i zaporke, kao što je prikazano u nastavku.

Opet otvorite app.py datoteku unutar virtualnog okruženja i zalijepite sljedeći kôd ispod funkcije token_required (f)

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

hashed_password = create_password_hash (podaci [‘lozinka’], metoda = ‘sha256’)

new_user = Korisnici (public_id = str (uuid.uuid4 ()), ime = podaci [‘ime’], lozinka = hashed_password, admin = False)
db.session.add (new_user)
db.session.commit ()

return jsonify ({‘message’: ‘uspješno registriran’})

Unutar virtualnog okruženja stvorite drugu rutu u aplikaciji app.py kako biste registriranim korisnicima omogućili prijavu.

Kad se korisnik prijavi, generira se nasumični token za pristup korisničkom API-ju.

Zalijepite kôd ispod ispod prethodne rute koju smo stvorili.

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

auth = zahtjev.autorizacija

ako ne auth ili ne auth.username ili ne auth.password:
povratak make_response (‘nije uspjelo provjeriti’, 401, {‘WWW.Authentication’: ‘Osnovno područje: "potrebna prijava"„})

korisnik = Users.query.filter_by (ime = auth.username) .first ()

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

povratak make_response (‘nije uspjelo provjeriti’, 401, {‘WWW.Authentication’: ‘Osnovno područje: "potrebna prijava"„})

Ipak, unutar virtualnog okruženja stvorite drugu rutu u datoteci app.py da biste dobili ili preuzeli sve registrirane korisnike.

Ovaj kôd provjerava sve registrirane korisnike u tablici korisnika i vraća konačni rezultat u JSON formatu.

Zalijepite kod ispod ispod rute za prijavu

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

users = Users.query.all ()

rezultat = []

za korisnika u korisnicima:
user_data = {}
user_data [‘public_id’] = user.public_id
user_data [‘name’] = korisničko ime
user_data [‘lozinka’] = user.password
user_data [‘admin’] = user.admin

result.append (user_data)

vratiti jsonify ({‘korisnici’: rezultat})

Napravite rute za tablicu autora 

Stvorimo rute za tablicu autora s ciljem da korisnicima omogućimo preuzimanje svih autora iz baze podataka, kao i brisanje autora.

Samo korisnici s važećim tokenima mogu obavljati ove API operacije.

Unutar app.py datoteke stvorite rutu za registrirane korisnike kako bi stvorili nove autore.

Zalijepite ovaj kôd ispod rute koja korisniku omogućuje preuzimanje svih registriranih korisnika.

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

data = request.get_json ()

new_authors = Autori (ime = podaci [‘ime’], zemlja = podaci [‘država’], knjiga = podaci [‘knjiga’], booker_prize = Istina, korisnik_id = trenutni_už.r.)
db.session.add (new_authors)
db.session.commit ()

return jsonify ({‘message’: ‘novi autor stvoren’})

Zatim stvorite drugu rutu kako biste omogućili registriranom korisniku s važećim tokenom da preuzme sve autore u tablici Autori kao što je prikazano u nastavku.

Zalijepite ovaj kôd ispod rute koja korisniku omogućuje stvaranje novog autora.

@ app.route (‘/ autori’, metode = [‘POST’, ‘GET’])
@token_required
def get_authors (current_user):

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

izlaz = []
za autore u autorima:

author_data = {}
author_data [‘name’] = autor.name
author_data [‘knjiga’] = autor.book
author_data [‘država’] = autor.broj
author_data [‘booker_prize’] = autor.booker_prize
output.append (author_data)

return jsonify ({‘list_of_authors’: izlaz})

Na kraju, još uvijek unutar app.py datoteke stvorite rutu za brisanje navedenog autora kao što je prikazano u nastavku.

Zalijepite ovaj kôd ispod rute koja korisniku omogućuje dohvaćanje popisa autora.

@ app.route (‘/ autori /’, metode = [‘DELETE’])
@token_required
def delete_author (current_user, author_id):
author = Autor.query.filter_by (id = author_id, user_id = current_user.id) .first ()
ako nije autor:
return jsonify ({‘message’: ‘autor ne postoji’})

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

return jsonify ({‘message’: ‘Autor je izbrisan’})

ako je __name__ == ‘__main__’:
app.run (ispravljanje = True)

Nakon toga spremite i zatvorite app.py datoteku unutar virtualnog okruženja.

Ispitivanje API-ja biblioteke s Postmanom

U ovom ćemo dijelu upotrijebiti poštar alat za slanje zahtjeva uslugama baze podataka. Ako na svom računalu nemate poštara, možete saznati kako to preuzeti i instalirati ovdje.

Osim poštara, možemo koristiti i druge alate kao što su Kovrča za slanje zahtjeva na poslužitelj.

Otvorite novi terminal i upišite sljedeće:

poštar

Komandni poštar uzrokovaće da vaš web preglednik prikaže donju stranicu:

postman_signup

Možete se prijaviti i stvoriti besplatni račun, ali preskočit ćemo i dobiti izravan pristup aplikaciji za testiranje API-ja knjižnice kao što je prikazano u nastavku:

Ispitajte api knjižnicu

U ovom ćemo dijelu omogućiti korisniku da se registrira za API knjižnice pružanjem korisničkog imena i jedinstvene lozinke u JSON formatu pomoću metode POST koristeći sljedeće korake:

  • Kliknite karticu s oznakom Body
  • Zatim odaberite sirovi gumb i odaberite format JSON
  • unesite korisničko ime i lozinku za registraciju kao što je prikazano na slici
  • Pored gumba za slanje umetnite sljedeći URL http://127.0.0.1/register
  • Na kraju promijenite metodu u POST i pritisnite gumb za slanje.

korisnik se registrira za api

Prikazat će se sljedeći izlaz kao što je prikazano u nastavku:

Sada smo uspješno registrirali korisnika. Krenimo napred da omogućimo korisniku koji se upravo registrirao da se prijavi kako bi stvorio privremeni slučajni token da pristupi tabeli autora pomoću sljedećih koraka:

  •  Kliknite karticu za autorizaciju.
  • U odjeljku tipa odaberite osnovnu provjeru autentičnosti.
  • Zatim ispunite obrazac za korisničko ime i lozinku s korisničkim imenom i lozinkom koju ste prethodno registrirali.
  • Na kraju, pritisnite gumb za slanje da biste se prijavili i generirali slučajni token.

Nakon uspješne prijave korisnik generira slučajni token za korisnika kao što je prikazano na snimci zaslona.

Iskoristit ćemo generirani slučajni token za pristup tablici Autori.

U ovom ćemo dijelu dodati podatke o autoru u tablicu autora putem POST metode slijedeći korake:

  • Kliknite karticu zaglavlja
  • Uključite sljedeće HTTP zaglavlje prikazane na snimci zaslona

  • Zatim kliknite karticu tijela i unesite podatke o novom autoru
  • Zatim pritisnite gumb za slanje da biste dodali detalje autora u Autorovu tablicu

Podaci autora mogu se pronaći i u tablici Autori putem sljedećeg:

  • Provjerite je li generirani token u odjeljku zaglavlja. ako ga nema, morate ga ispuniti svojim tokenom.
  • Pored gumba za slanje unesite ovaj URL http://127.0.0.1/authors
  • Zatim promijenite HTTP metodu u GET i pritisnite gumb za slanje kako biste pronašli pojedinosti autora.

Konačno, možete izbrisati autora (e) u tablici Autori (DELETE) metodom DELETE sljedećim koracima:

  • Provjerite je li vaš token još uvijek u odjeljku zaglavlja. Možete provjeriti karticu zaglavlja da biste provjerili jesu li potrebne informacije.
  • Pored gumba za slanje unesite ovaj URL http://127.0.0.1/sam
  • Zatim pritisnite gumb za slanje da biste izbrisali korisnika kojeg ste odredili.

Kompletan izvorni kôd možete pronaći na Github.  Možete ga klonirati i provjeriti na svom stroju.

OZNAKE:

  • Piton

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