Kaip apsaugoti „Flask REST“ API naudojant „JSON Web Token“?

Sužinokime, kaip apsaugoti REST API su JSON žiniatinklio žetonais, kad vartotojai ir trečiųjų šalių programos negalėtų juo piktnaudžiauti.


Mes sukursime duomenų bazės paslaugą naudodami SQLite ir leisti vartotojams prieiti prie jos per REST API, naudojant HTTP metodus, tokius kaip POST ir PUT.

Be to, mes sužinosime, kodėl JSON žiniatinklio žetonai yra tinkamas būdas apsaugoti poilsio API vietoj suvestinės ir pagrindinio autentifikavimo. Prieš pradėdami toliau, supraskime terminą JSON interneto žetonai, REST API ir Flask framework.

JSON interneto žetonai

JSON interneto prieigos raktas, dar žinomas kaip JWT, yra saugus atsitiktinių žetonų perdavimo būdas tarp dviejų šalių ar subjektų. JSON paprastai susideda iš trijų toliau nurodytų dalių.

  • Naudingas krovinys
  • Antraštė
  • Parašas

Perduodamas duomenis ar informaciją iš dviejų šalių, JSON naudoja dviejų tipų struktūros formas.

  • Serialas
  • Deserializuotas

Serijinė forma naudojama perduodant duomenis į tinklą per kiekvieną užklausą ir atsakymą, tuo tarpu tinkama forma naudojama skaitant ir rašant duomenis į interneto žetoną..

Serijine forma yra trys komponentai.

  • Antraštė
  • Naudingas krovinys
  • Parašas

Antraštės komponentas apibrėžia kriptografinę informaciją apie žetonus. Pavyzdžiui:

  • Ar jis yra pasirašytas, ar nepasirašytas JWT?
  • Apibrėžkite algoritmo metodus

Pelnytą formą, skirtingai nei serializuotą, sudaro du komponentai.

  • Naudingas krovinys
  • Antraštė

REST API

API (programų programavimo sąsaja) leidžia susisiekti tarp dviejų programų, kad būtų galima nuskaityti ar pateikti duomenis. Yra du populiarūs API tipai – žiniatinklio ir sistemos API.

Šiame straipsnyje apžvelgsime tik žiniatinklio API. Yra du žiniatinklio API tipai.

  • Užklausa – atsakymo API: poilsis, „GraphQL“, nuotolinės procedūros skambutis (RPC)
  • Įvykių pagrįsta API: „WebHooks“, interneto lizdai, HTTP srautas

REST API patenka į atsakymo į užklausą kategoriją. API operacijoms atlikti naudojami tokie HTTP metodai kaip GET, POST ir PUT.

Klasikinis pavyzdys yra tada, kai vartotojas siunčia GET metodą žiniatinklio tarnybai, kad paprašytų ar nuskaitytų konkretų šaltinį ar išteklių kolekciją. Tada serveris grąžina konkrečius išteklius ar išteklių kolekciją vartotojui, kuris jo paprašė.

Kolbos karkasas

Kolba yra pagrindas, pagrįstas python’u. Tai yra mikrosistema, kurią python kūrėjai naudoja poilsio API kūrimui. Tai vadinama mikrotvarka, nes ji, pavyzdžiui, leidžia kūrėjams pridėti pasirinktinį autentifikavimą ir bet kurią kitą pagrindinę sistemą, pagrįstą nuostatomis.

Pradėkime nuo diegimo. Mano sistemos sąranka yra tokia.

  • „Ubuntu“ kaip OS
  • Python 2.7+
  • Paštininkas

Nustatykite virtualią aplinką naudodami virtualenv

Turime nustatyti virtualią aplinką, kad įsitikintume, jog kai kurie paketai neprieštaraus sistemos paketams. Panaudokime virtualenv norėdami sukurti naują virtualią aplinką.

Jei jūsų sistemoje yra pip komanda, paleiskite šią komandą, norėdami įdiegti pip.

pip įdiegti virtualenv

Jei jūsų kompiuteryje nėra pipo, atlikite tai dokumentacija įdiegti PIP savo sistemoje.

Tada sukurkime katalogą, kuriame galime saugoti ar laikyti mūsų virtualią aplinką. Norėdami sukurti katalogą, naudokite žemiau pateiktą komandą mkdir

„mkdir“ kolbos projektas

Pereikite į „kolbos projekto“ katalogą naudodami šią komandą

kompaktinis diskas

Norėdami sukurti virtualią aplinką, naudokite „virtualenv“ įrankį „flaskproject“ kataloge, kaip parodyta žemiau:

virtualenv flaskapi

Panaudoję virtualenv įrankį virtualiai aplinkai sukurti, paleiskite cd komandą, kad pereitumėte į „flaskapi“ katalogą kaip virtualią aplinką ir suaktyvinkite ją naudodamiesi žemiau pateikta komanda.

šaltinio šiukšliadėžė / aktyvuoti

Vykdykite visas su šiuo projektu susijusias užduotis virtualioje aplinkoje.

Įdiekite paketus naudodami pip

Dabar atėjo laikas įdiegti tokius paketus kaip „kolbos karkasas“ ir „PyJWT“, kuriuos panaudosime kurdami likusią API ir kitus reikalingus paketus savo API projektui.

Sukurkite reikalavimus.txt failą su šiais paketais.

Kolba
dienos laikas
uuid
Kolba-SQLAlchemija
PyJWT

Įdiekite juos su pip.

„pip install“ – reikalavimai.txt

Nustatykite duomenų bazę

Įdiegkime „SQLite“.

apt-get įdiegti „sqlite3“

Sukurkite duomenų bazę, pavadintą biblioteka. Šioje duomenų bazėje sukursime dvi lenteles, būtent Vartotojų ir Autorių lentelę.

Vartotojų lentelėje bus registruoti vartotojai. Prieigos prie autorių lentelės gali prisijungti tik registruoti vartotojai.

Autorių lentelėje bus saugoma informacija apie autorius arba išsami informacija, tokia kaip autoriaus vardas, gimimo šalis ir kt., Kuriuos pateikė registruoti vartotojai.

Sukurkite duomenų bazę naudodami šią komandą:

„sqlite3 library.db“

Galite patikrinti, ar sėkmingai sukūrėte duomenų bazę, naudodamiesi žemiau pateikta komanda:

.duomenų bazės

Atidarykite naują terminalą ir vykdykite šiuos veiksmus virtualioje aplinkoje, kurią sukūrėme anksčiau.

palieskite „app.py“

Įklijuokite šį kodą faile pavadinimu „app.py“

iš kolbos importuoti Kolba, prašyti, jsonify, make_response
iš „flask_sqlalchemy“ importo „SQLAlchemy“
iš werkzeug.security importavimo generuoti slaptažodžio_pašaką, patikrinimo_saugos_raštį
importuoti uuid
importuoti jwt
importuoti dienos laiką
iš functools importuoja įvyniojimus

Pirma aukščiau esančio kodo eilutė importuoja tokius paketus kaip „request“ ir „jsonify“. Mes naudosime užklausą, kad galėtume sekti užklausos lygio duomenis užklausos metu, ir naudosime „jsonify“, kad pateiktume atsakymus JSON formatas.

Kitoje eilutėje mes importavome SQLAlchemy iš flask_sqlalchemy, kad integruotume SQLAlchemy ypatybes į kolbą.

Iš „werkzeug.security“ mes importavome „genere_password_hash“, kad būtų sugeneruotas slaptažodžio maišos vartotojams, ir „check_password_hash“, kad patikrintume vartotojo slaptažodį, kai lyginame vartotojų pateiktą slaptažodį su duomenų bazėje saugomais vartotojų slaptažodžiais..

Galiausiai mes importavome uuid, dar žinomus kaip universalius unikalius identifikatorius, kad vartotojams būtų generuojami atsitiktiniai ID numeriai.

Vis dėlto „app.py“ faile įgyvendinkite bibliotekos API konfigūracijos parametrus naudodami žemiau esantį kodą „app.py“ faile.

Įveskite šį kodą po importavimo pareiškimu.

programa = Kolba (__ vardas__)

app.config [‘SECRET_KEY’] = ‘Th1s1ss3cr3t’
app.config [‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite: /////home/michael/geekdemos/geekapp/library.db’
app.config [‘SQLALCHEMY_TRACK_MODIFICATIONS’] = Tiesa

db = SQLAlchemija (programa)

Dabar sukurkite du vartotojų ir autorių lentelės modelius, kaip parodyta žemiau. Nukopijuokite ir įklijuokite kodą „app.py“ faile.

Įveskite kodą žemiau, tiesiai po šia duomenų bazės dalimi, nustatymu db = SQLAlchemy (app)

klasės vartotojai (db.Model):
id = db.Collection (db.Integer, basic_key = True)
public_id = db.Collection (db.Integer)
vardas = db.kolonė (db.String (50))
slaptažodis = db.kolonė („db.String“ (50))
admin = db.Collection (db.Boolean)
klasės autoriai (db.modelis):
id = db.Collection (db.Integer, basic_key = True)
name = db.Collection (db.String (50), unikalus = tiesa, niekinis = klaidingas))
knyga = db.Skolona (db.String (20), unikali = teisinga, niekinė = klaidinga))
šalis = db.kolonė („db.String“ (50), niekinė = klaidinga))
booker_prize = db.Column (db.Boolean)

Generuokite vartotojų ir autorių lenteles

Terminale įveskite šį kodą virtualioje aplinkoje, kad sukurtumėte arba sukurtumėte lenteles tiek vartotojams, tiek autoriams, kaip parodyta žemiau

iš programos importavimo db
db.create_all ()

Po to virtualioje aplinkoje atidarykite „app.py“ failą ir sukurkite kitą funkciją.

Ši funkcija sugeneruos žetonus, kad tik registruoti vartotojai galėtų prieiti prie API operacijų rinkinio ir atlikti lentelę Autoriai.

Įveskite šį kodą po lentelės „Autoriai“ duomenų bazės modeliu

def token_required (f):
@ apvyniojimai (f)
def dekoratorius (* args, ** kwargs):

ženklas = Nėra

jei „request.head“ yra „x-access-tokens“:
token = request.headers [‘x-access-tokens’]

jei ne ženklas:
grąžinti „jsonify“ ({‘pranešimas’: ‘trūksta galiojančio prieigos rakto’})

bandyti:
data = jwt.decode (prieigos raktas, „app.config“ [SECRET_KEY])
current_user = Users.query.filter_by (public_id = data [‘public_id’]). pirma ()
išskyrus:
grąžinti „jsonify“ ({‘pranešimas’: ‘prieigos raktas netinkamas’})

grįžti f (dabartinis_naudotojas, * args, ** kwargs)
grąžinimo dekoratorius

Kurti maršrutus vartotojų lentelėms

Dabar sukurkime maršrutą, kad vartotojai galėtų prisijungti prie Autorių API naudodami vartotojo vardą ir slaptažodį, kaip parodyta žemiau.

Vėl atidarykite „app.py“ failą virtualioje aplinkoje ir įklijuokite šį kodą po funkcija token_required (f)

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

hashed_password = generator_password_hash (duomenys [‘slaptažodis’], metodas = ‘sha256’)

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

grąžinti „jsonify“ ({‘pranešimas’: ‘sėkmingai užregistruotas’})

Virtualioje aplinkoje sukurkite kitą maršrutą „app.py“ faile, kad registruoti vartotojai galėtų prisijungti.

Kai vartotojas prisijungia, vartotojui sukuriamas atsitiktinis prieigos raktas, kad jis galėtų prisijungti prie bibliotekos API.

Įklijuokite kodą žemiau po ankstesniu mūsų sukurtu maršrutu.

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

auth = request.authorization

jei ne aut., ar ne. aut. vartotojo vardas, arba ne.
return make_response (‘Nepavyko patvirtinti’, 401, {‘WWW.Authentication’: ‘Pagrindinė sritis: "reikalingas prisijungimas"’})

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

if check_password_hash (vartotojo slaptažodis, aut. slaptažodis):
token = jwt.encode ({‘public_id’: user.public_id, ‘exp’: datetime.datetime.utcnow () + datetime.timedelta (minutes = 30)}, app.config [‘SECRET_KEY’])
grąžinti „jsonify“ ({‘token’: token.decode (‘UTF-8’)})

return make_response (‘Nepavyko patvirtinti’, 401, {‘WWW.Authentication’: ‘Pagrindinė sritis: "reikalingas prisijungimas"’})

Vis dėlto virtualioje aplinkoje „app.py“ faile sukurkite kitą maršrutą, kad gautumėte arba gautumėte visus registruotus vartotojus.

Šis kodas patikrina visus registruotus vartotojus lentelėje „Vartotojai“ ir grąžina galutinį rezultatą JSON formatu.

Įklijuokite kodą žemiau prisijungimo maršruto

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

vartotojai = Users.query.all ()

rezultatas = []

vartotojui vartotojui:
user_data = {}
user_data [‘public_id’] = user.public_id
vartotojo_duomenys [‘vardas’] = vartotojo vardas
vartotojo duomenys [‘slaptažodis’] = vartotojo slaptažodis
user_data [‘admin’] = user.admin

rezultatas.append (vartotojo duomenys)

return jsonify ({‘vartotojai’: rezultatas})

Sukurkite maršrutus autorių lentelėje 

Kurkime lentelių Autoriai maršrutus, kad vartotojai galėtų nuskaityti visus autorius duomenų bazėje ir ištrinti autorius.

Tik naudotojai, turintys galiojančius prieigos raktus, gali atlikti šias API operacijas.

„App.py“ faile sukurkite kelią registruotiems vartotojams kurti naujus autorius.

Įklijuokite šį kodą po maršrutu, kuris leidžia vartotojui atkurti visus registruotus vartotojus.

@ app.route (‘/ autorius’, metodai = [‘POST’, ‘GET’])
@token_required
def sukurti_author (dabartinis_naudotojas):

data = request.get_json ()

new_authors = Autoriai (vardas = duomenys [‘vardas’], šalis = duomenys [‘šalis’], knyga = duomenys [‘knyga’], booker_prize = True, user_id = current_user.id)
db.session.add (nauji autoriai)
db.session.commit ()

return jsonify ({‘pranešimas’: ‘naujas autorius sukurtas’})

Tada sukurkite kitą maršrutą, kad registruotas vartotojas su galiojančiu prieigos raktu galėtų nuskaityti visus autorius iš lentelės Autoriai, kaip parodyta žemiau..

Įklijuokite šį kodą žemiau maršruto, kuris leidžia vartotojui sukurti naują autorių.

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

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

išėjimas = []
autoriui autoriuose:

author_data = {}
autoriaus duomenys [‘vardas’] = autoriaus vardas
autorių duomenys [‘knyga’] = autorių knyga
autoriaus duomenys [‘šalis’] = autoriaus šalis
author_data [‘booker_prize’] = author.booker_prize
output.append (autoriaus duomenys)

return jsonify ({‘list_of_authors’: output})

Galiausiai vis dar esančiame „app.py“ faile, sukurkite nurodytą autorių ištrynimo kelią, kaip parodyta žemiau.

Įklijuokite šį kodą po maršrutu, kuris leidžia vartotojui nuskaityti autorių sąrašą.

@ app.route (‘/ autoriai /’, metodai = [‘DELETE’])
@token_required
def delete_author (dabartinis_naudotojas, autoriaus_id):
autorius = Author.query.filter_by (id = author_id, user_id = current_user.id) .first ()
jei ne autorius:
return jsonify ({‘žinutė’: ‘autoriaus neegzistuoja’})

db.session.delete (autorius)
db.session.commit ()

grąžinti „jsonify“ ({‘pranešimas’: ‘Autorius ištrintas’})

jei __name__ == ‘__main__’:
app.run (derinimo priemonė = tiesa)

Vėliau išsaugokite ir uždarykite „app.py“ failą virtualioje aplinkoje.

Bibliotekos API išbandymas naudojant „Postman“

Šiame skyriuje naudosime paštininko įrankį, norėdami išsiųsti užklausą duomenų bazės tarnyboms. Jei jūsų kompiuteryje nėra paštininko, galite sužinoti, kaip jį atsisiųsti ir įdiegti čia.

Be paštininko, mes galime naudoti ir kitas priemones, tokias kaip Garbanoti siųsti užklausas į serverį.

Atidarykite naują terminalą ir įveskite:

paštininkas

Komandos paštininkas privers jūsų interneto naršyklę parodyti žemiau esantį puslapį:

paštininko parašas

Galite nuspręsti prisiregistruoti ir sukurti nemokamą paskyrą, tačiau mes praleidžiame ir gausime tiesioginę prieigą prie programos, kad išbandytume bibliotekos API, kaip parodyta toliau:

Išbandykite bibliotekos api

Šiame skyriuje leisime vartotojui registruotis prie bibliotekos API pateikdami vartotojo vardą ir unikalų slaptažodį JSON formatu, naudodami POST metodą, atlikdami šiuos veiksmus:

  • Spustelėkite skirtuką, pažymėtą Kūnas
  • Tada pasirinkite neapdorotą mygtuką ir pasirinkite JSON formatą
  • įveskite vartotojo vardą ir slaptažodį, kad užsiregistruotumėte, kaip parodyta ekrano kopijoje
  • Šalia mygtuko „Siųsti“ įterpkite šį URL: http://127.0.0.1/register
  • Galiausiai pakeiskite metodą į POST ir paspauskite mygtuką „Siųsti“.

vartotojas registruojasi api

Tai parodys toliau pateiktą išvestį:

Dabar sėkmingai užregistravome vartotoją. Pereikime prie to, kad ką tik prisiregistravęs vartotojas galėtų prisijungti, kad galėtų sugeneruoti laikiną atsitiktinį prieigos raktą, kad pasiektų Autorių lentelę atlikdamas šiuos veiksmus:

  •  Spustelėkite leidimo skirtuką.
  • Skyriuje tipas pasirinkite pagrindinį autentifikavimą.
  • Tada užpildykite vartotojo vardo ir slaptažodžio formą tuo vartotojo vardu ir slaptažodžiu, kurį anksčiau užregistravote.
  • Galiausiai paspauskite mygtuką Siųsti, kad prisijungtumėte ir sugeneruotumėte atsitiktinį prieigos raktą.

Sėkmingai prisijungus prie vartotojo, vartotojui sukuriamas atsitiktinis prieigos raktas, kaip parodyta ekrano kopijoje.

Mes pasinaudosime sugeneruotu atsitiktiniu prieigos raktu, kad pasiektume lentelę Autoriai.

Šiame skyriuje mes pridėsime informaciją apie autorių prie Autorių lentelės naudodamiesi POST metodu atlikdami šiuos veiksmus:

  • Spustelėkite skirtuką Antraštės
  • Įtraukite šias ekrano kopijoje rodomas HTTP antraštes

  • Tada spustelėkite pagrindinį skirtuką ir įveskite naujojo autoriaus duomenis
  • Tada paspauskite mygtuką siųsti, kad pridėtumėte išsamią informaciją apie autorių prie autoriaus lentelės

Taip pat galite gauti informaciją apie autorius iš Autorių lentelės, naudodamiesi šiais būdais:

  • Įsitikinkite, kad sugeneruotas prieigos raktas yra antraščių skiltyje. jei jo nėra, turite jį užpildyti savo žetonu.
  • Šalia mygtuko „Siųsti“ įveskite šį URL: http://127.0.0.1/authors
  • Tada pakeiskite HTTP metodą į GET ir paspauskite mygtuką Siųsti, kad gautumėte išsamią informaciją apie autorius.

Galiausiai galite ištrinti autorius (-ius) iš Autorių lentelės naudodami DELETE metodą atlikdami šiuos veiksmus:

  • Įsitikinkite, kad jūsų prieigos raktas vis dar yra antraščių skiltyje. Galite patikrinti skirtuką antraštės, kad įsitikintumėte, jog yra reikiama informacija.
  • Šalia mygtuko „Siųsti“ įveskite šį URL http://127.0.0.1/sam
  • Tada paspauskite mygtuką „Siųsti“, kad ištrintumėte nurodytą vartotoją.

Visą šaltinio kodą galite rasti svetainėje Github.  Galite jį klonuoti ir patikrinti savo kompiuteryje.

ŽENKLAI:

  • 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