Kuidas kaitsta kolbi REST API-t JSON Web Tokeniga?

Õppige, kuidas kaitsta REST-i API-sid JSON-i veebimärkidega, et kasutajad ja kolmandate osapoolte rakendused ei saaks seda kuritarvitada.


Ehitame andmebaasiteenuse kasutades SQLite ja võimaldada kasutajatel sellele juurde pääseda REST API kaudu, kasutades HTTP-meetodeid, näiteks POST ja PUT.

Lisaks saame teada, miks JSON-i veebimärgid on kokkuvõtete ja põhilise autentimise asemel sobilik viis puhke API kaitsmiseks. Enne jätkamist mõelgem mõistele JSON veebitunnused, REST API ja Flask Framework.

JSON veebimärgid

JSON veebimärk, tuntud ka kui JWT, on turvaline viis juhuslike märkide ülekandmiseks kahe osapoole või üksuse vahel. JSON koosneb tavaliselt järgmisest kolmest osast.

  • Kasulik koormus
  • Päis
  • Allkiri

JSON kasutab andmete või teabe edastamisel kahe osapoole vahel kahte tüüpi struktuurivorme.

  • Serialiseeritud
  • Deserialiseeritud

Serialiseeritud vormi kasutatakse andmete edastamisel võrku iga päringu ja vastuse kaudu, samas kui veebisaidile andmete lugemisel ja kirjutamisel kasutatakse tasulist vormi..

Sarjakujulisel kujul on kolm komponenti.

  • Päis
  • Kasulik koormus
  • Allkiri

Päise komponent määratleb krüptograafilise teabe tokenite kohta. Näiteks:

  • Kas see on allkirjastatud või allkirjastamata JWT?
  • Määratlege algoritmi tehnikad

Erinevalt serialiseeritud vormist koosneb teenitud vorm kahest komponendist.

  • Kasulik koormus
  • Päis

REST API

API (rakenduste programmeerimisliides) võimaldab andmete hankimiseks või edastamiseks suhelda kahe rakenduse vahel. Seal on kahte populaarset tüüpi API-sid – veebi- ja süsteemiliidesed.

Selles artiklis käsitleme ainult veebi API-d. Veebi API-sid on kahte tüüpi.

  • Taotlus – vastuse API: puhke-, GraphQL-, kaugprotseduurikõne (RPC)
  • Sündmustest lähtuv API: veebipäevikud, veebipistikupesad, HTTP voogesitus

REST API kuulub päringu-vastuse kategooriasse. See kasutab API-toimingute tegemiseks selliseid HTTP-meetodeid nagu GET, POST ja PUT.

Klassikaline näide on see, kui kasutaja saadab veebiteenusele GET-meetodi, et taotleda või hankida konkreetset ressurssi või ressursikogumit. Seejärel saadab server konkreetse ressursi või ressursikogumi kasutajale, kes seda taotles.

Kolvi raamistik

Kolb on pütoonil põhinev raamistik. See on mikroraamistik, mida pythoni arendajad kasutavad puhke API loomiseks. Seda nimetatakse mikroraamistikuks, kuna see võimaldab näiteks arendajatel eelistustele tuginedes lisada kohandatud autentimise ja mis tahes muud tagapõhissüsteemi..

Alustame selle juurutamist. Minu süsteemi häälestus on järgmine.

  • Ubuntu kui OS
  • Python 2.7+
  • Postiljon

Seadistage virtualenv abil virtuaalne keskkond

Peame seadistama virtuaalse keskkonna, tagamaks, et mõned paketid ei oleks süsteemipakettidega vastuolus. Kasutagem virtualenvi uue virtuaalse keskkonna seadistamiseks.

Eeldusel, et pip-käsk on teie süsteemis saadaval, käivitage järgmine käsk pipi installimiseks.

pip install virtualenv

Kui teil pole masinal pippi, siis järgige seda dokumentatsioon pipi paigaldamiseks oma süsteemi.

Järgmisena loome kataloogi meie virtuaalse keskkonna hoidmiseks või hoidmiseks. Kasutage kataloogi loomiseks allolevat käsku mkdir

mkdir kolbiprojekt

Kasutage järgmise käsu abil kolbprojekti kataloogi

CD kolbiprojekt

Kasutage kolbprojekti kataloogis kataloogist virtualenv tööriista virtuaalse keskkonna loomiseks, nagu allpool näidatud:

virtualenv flaskapi

Kui olete virtuaalse keskkonna loomiseks tööriista virtualenv kasutanud, käivitage käsk cd, et minna virtuaalse keskkonnana flaskapi kataloogi ja aktiveerida see, kasutades alltoodud käsku.

allikas / aktiveeri

Tehke kõik selle projektiga seotud ülesanded virtuaalses keskkonnas.

Paigaldage pakendid pipi abil

Nüüd on aeg installida sellised paketid nagu kolbi raamistik ja PyJWT, mida kasutame ülejäänud API ja muude vajalike pakettide ehitamiseks meie API projekti jaoks.

Looge järgmiste pakettidega fail.t.txt.

Kolb
kuupäev Kellaaeg
uuid
Kolb-SQLAlkeemia
PyJWT

Paigaldage need pipiga.

pip install -r nõuetele.txt

Seadistage andmebaas

Installigem SQLite.

apt-get install sqlite3

Loo andmebaas nimega teegi. Selle andmebaasi sees loome kaks tabelit, nimelt tabeli Kasutajad ja autorid.

Kasutajate tabel sisaldab registreeritud kasutajaid. Ainult registreeritud kasutajatel on juurdepääs tabelile Autorid.

Autorite tabel salvestab registreeritud kasutajate esitatud teabe või üksikasjad nagu autori nimi, sünniriik jne..

Looge andmebaas järgmise käsu abil:

sqlite3 library.db

Järgmise käsu abil saate kontrollida, kas olete andmebaasi edukalt loonud:

.andmebaasid

Avage uus terminal ja käivitage varem loodud virtuaalses keskkonnas järgmine.

puudutage rakendust.py

Kleepige järgmine kood faili nimega app.py

kolbist importkolb, taotlege, jsonify, make_response
alates kolb_sqlalkeemia impordi SQLAlchemy
saidilt werkzeug.security importige genereerimisparool_saht, kontrollige parool_saadet
import uuid
import jwt
impordi kuupäev
funktoolidest impordimähised

Ülaltoodud koodi esimene rida impordib sellised paketid nagu päring ja jsonify. Kasutame päringut päringu taseme andmete jälgimiseks päringu ajal ja jsonify abil vastuste väljastamiseks JSON vormingus.

Järgmisel real importisime SQLAlchemy kolbist_sqlalkeemia, et integreerida SQLAlchemy funktsioonid kolbi.

Werkzeug.security kaudu importisime genereerida parooliräsa genereerimiseks kasutajate genereerimise_parool_hašija ja kasutaja parooli kontrollimiseks kontrollime parooli_haši, kui kasutajate sisestatud parooli võrreldakse andmebaasis salvestatud kasutajate paroolidega..

Lõpuks importisime uuid, mida tuntakse ka kui universaalseid kordumatuid tunnuseid, et luua kasutajatele juhuslikke id-numbreid.

Sellegipoolest rakendage failis app.py konfiguratsioonisätted teegi API-le, kasutades allpool olevat koodi app.py-failis.

Paigutage järgmine kood impordi väljavõtte alla.

rakendus = kolb (__ nimi__)

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

db = SQLAlkeemia (rakendus)

Nüüd looge tabelite Kasutajad ja Autorid jaoks kaks mudelit, nagu allpool näidatud. Kopeerige ja kleepige kood app.py-faili.

Paigutage kood allpool selle andmebaasi alla seadet db = SQLAlchemy (rakendus)

klassi kasutajad (db.Model):
id = db.veerg (db.Integer, primaarklahv = tõene)
public_id = db.Cumn (db.Integer)
nimi = db.veerg (db.String (50))
parool = db.veerg (db.String (50))
admin = db.veerg (db.Boolean)
klassi autorid (db.Model):
id = db.veerg (db.Integer, primaarklahv = tõene)
nimi = db.veerg (db.String (50), kordumatu = tõene, tühistatav = vale))
raamat = db.veerg (db.String (20), kordumatu = tõene, tühistatav = vale))
riik = db.veerg (db.String (50), nullitav = vale))
booker_prize = db.Column (db.Boolean)

Genereerige kasutajate ja autorite tabelid

Tippige terminalis virtuaalses keskkonnas järgmine kood, et genereerida või luua tabelid nii Kasutajate kui Autorite tabelitele, nagu allpool näidatud

rakenduse impordi db-st
db.create_all ()

Pärast seda avage virtuaalses keskkonnas rakendus app.py ja looge teine ​​funktsioon.

See funktsioon genereerib žetoone, mis võimaldavad ainult registreeritud kasutajatel juurde pääseda API-toimingute komplektile ja teostada seda tabelis Autorid.

Pange see kood tabelite Autorid andmebaasi mudeli alla

def token_required (f):
@ mähised (f)
def decorator (* args, ** kwargs):

märk = puudub

kui päringus päised on „x-juurdepääsu tokenid”:
token = request.headers [‘x-access-tokens’]

kui mitte märk:
return jsonify ({‘teade’: ‘kehtiv märk puudub’})

proovige:
data = jwt.decode (märk, app.config [SECRET_KEY])
current_user = Users.query.filter_by (public_id = data [‘public_id’]). first ()
välja arvatud:
return jsonify ({‘teade’: ‘luba on kehtetu’})

return f (praegune_kasutaja, * args, ** kwargs)
tagasta dekoraator

Looge kasutajate tabeli jaoks marsruute

Nüüd loome marsruudi, mis võimaldab kasutajatel registreeruda autorite API-le kasutajanime ja parooli kaudu, nagu allpool näidatud.

Avage uuesti virtuaalses keskkonnas rakendus app.py ja kleepige funktsiooni token_required (f) alla järgmine kood

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

hashed_password = genereerima_parool_hash (andmed [‘parool’], meetod = ‘sha256’)

new_user = Kasutajad (public_id = str (uuid.uuid4 ()), nimi = andmed [‘nimi’], parool = hashed_ parool, admin = vale
db.session.add (new_user)
db.session.commit ()

return jsonify ({‘teade’: ‘edukalt registreeritud’})

Virtuaalses keskkonnas looge failis app.py teine ​​marsruut, et registreeritud kasutajad saaksid sisse logida.

Kui kasutaja sisse logib, genereeritakse juhuslik luba kasutajale raamatukogu API juurde pääsemiseks.

Kleepige allolev kood eelmise meie loodud marsruudi alla.

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

auth = päring.autoriseerimine

kui mitte, siis auth või mitte auth.username või ei auth.parool:
return make_response (‘ei saanud kinnitada’, 401, {‘WWW.Authentication’: ‘Põhimaailm: "vajalik sisselogimine"’})

kasutaja = kasutajad.päring.filter_by (nimi = aut .kasutaja nimi) .first ()

if check_password_hash (kasutaja.parool, aut.parool):
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 (‘ei saanud kinnitada’, 401, {‘WWW.Authentication’: ‘Põhimaailm: "vajalik sisselogimine"’})

Sellegipoolest looge virtuaalses keskkonnas faili app.py teine ​​marsruut kõigi registreeritud kasutajate saamiseks või hankimiseks.

See kood kontrollib kõiki registreerunud kasutajaid tabelis Kasutajad ja tagastab lõpptulemuse JSON-vormingus.

Kleepige allolev kood sisselogimismarsruudi alla

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

kasutajad = kasutajad.query.all ()

tulemus = []

kasutajatele kasutajates:
user_data = {}
kasutaja_andmed [‘public_id’] = kasutaja.avalik_id
kasutaja_andmed [‘nimi’] = kasutajanimi.nimi
kasutaja_andmed [‘parool’] = kasutaja parool
kasutaja_andmed [‘admin’] = kasutaja.admin

tulemus.append (kasutaja_andmed)

return jsonify ({‘kasutajad’: tulemus})

Looge autorite tabeli marsruudid 

Loome marsruudil Autorite tabel, et kasutajad saaksid andmebaasist kõik autorid alla laadida ja autoreid kustutada.

Neid API toiminguid saavad teha ainult kehtivate lubadega kasutajad.

Loo failis app.py uute kasutajate loomiseks marsruut registreeritud kasutajatele.

Kleepige see marsruudi alla, mis võimaldab kasutajal laadida kõik registreeritud kasutajad.

@ app.route (‘/ autor’, meetodid = [‘POST’, ‘GET’])
@token_required
def luua_autor (praegune_kasutaja):

data = request.get_json ()

new_authors = Autorid (nimi = andmed [‘nimi’], riik = andmed [‘riik’], raamat = andmed [‘raamat’], booker_prize = True, user_id = current_user.id)
db.session.add (uued_autorid)
db.session.commit ()

return jsonify ({‘teade’: ‘uus autor loodud’})

Seejärel looge teine ​​marsruut, mis võimaldab kehtiva loaga registreeritud kasutajal kõigi autorite tabeli Autorid alla laadida, nagu allpool näidatud..

Kleebi see kood marsruudi alla, mis võimaldab kasutajal luua uue autori.

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

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

väljund = []
autoritele autorites:

autor_data = {}
autor_data [‘nimi’] = autor.nimi
autor_data [‘raamat’] = autor.raamat
autor_data [‘riik’] = autor.riik
autor_data [‘booker_prize’] = autor.booker_prize
output.append (autori_andmed)

return jsonify ({‘list_of_authors’: output})

Lõpuks looge endiselt rakenduse app.py sees marsruut määratud autori kustutamiseks, nagu allpool näidatud.

Kleebi see kood marsruudi alla, mis võimaldab kasutajal hankida autorite loendi.

@ app.route (‘/ autorid /’, meetodid = [‘DELETE’])
@token_required
def delete_author (praegune_kasutaja, autori_id):
author = Author.query.filter_by (id = author_id, user_id = current_user.id) .first ()
kui mitte autor:
return jsonify ({‘teade’: ‘autorit pole olemas’})

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

return jsonify ({‘teade’: ‘Autor kustutatud’})

kui __name__ == ‘__main__’:
app.run (silumine = tõene)

Seejärel salvestage ja sulgege app.py-fail virtuaalses keskkonnas.

Raamatukogu API testimine Postmaniga

Selles jaotises kasutame andmebaasi teenustele päringu saatmiseks postiljoni tööriista. Kui teil pole masinas postiljoni, saate teada, kuidas seda alla laadida ja installida siin.

Lisaks postiljonile võime kasutada ka muid tööriistu, näiteks Curl serverisse päringute saatmiseks.

Avage uus terminal ja tippige järgmine tekst:

postiljon

Käskluse postitaja paneb teie veebibrauseri kuvama järgmist lehte:

postitaja_kirjutamine

Võite otsustada registreeruda ja luua tasuta konto, kuid jätame selle raamatukogu API testimiseks vahele ja saame selle otse juurde, nagu allpool näidatud.

Katsetage raamatukogu api

Selles jaotises lubame kasutajal registreeruda teegi API-le, pakkudes kasutajanime ja unikaalset parooli JSON-vormingus, kasutades POST-meetodit, järgides järgmisi samme:

  • Klõpsake vahekaarti sildiga Kere
  • Seejärel valige toores nupp ja valige JSON-vorming
  • sisestage kasutajanimi ja parool, et registreeruda ekraanipildil näidatud viisil
  • Sisestage saatmisnupu kõrval järgmine URL http://127.0.0.1/register
  • Lõpuks muutke meetodiks POST ja vajutage saatmisnuppu.

kasutaja registreerib api

Kuvatakse järgmine väljund, nagu allpool näidatud:

Nüüd oleme kasutaja edukalt registreerinud. Lihtsalt lubame äsja registreerunud kasutajal sisse logida, et genereerida ajutine juhuslik luba, et pääseda tabelisse Autorid järgmiste toimingute abil:

  •  Klõpsake vahekaarti autoriseerimine.
  • Valige jaotise tüüp all põhiline autentimine.
  • Seejärel täitke kasutajanime ja parooli vorm kasutajanime ja parooliga, millega varem registreerusite.
  • Lõpuks vajutage sisselogimiseks saatmisnuppu ja juhusliku loa genereerimiseks.

Kui kasutaja on edukalt sisse loginud, genereeritakse kasutaja jaoks juhuslik luba, nagu ekraanipildil näidatud.

Kasutame loodud juhuslikku luba, et pääseda juurde tabelisse Autorid.

Selles jaotises lisame POST-meetodi abil tabelisse Autorid autori teabe, kasutades järgmisi samme:

  • Klõpsake vahekaarti Päised
  • Lisage järgmised ekraanipildil näidatud HTTP-päised

  • Järgmisena klõpsake vahekaarti body ja sisestage uue autori andmed
  • Seejärel vajutage autori andmete lisamiseks autori tabelisse saatmisnuppu

Autoriteabe leiate tabelist Autorid ka järgmiselt:

  • Veenduge, et teie genereeritud luba on jaotises päised. kui seda pole seal, peate selle oma märgiga täitma.
  • Sisestage saatmisnupu kõrval see URL http://127.0.0.1/authors
  • Seejärel muutke HTTP-meetodiks GET ja autori üksikasjade taastamiseks vajutage saatmisnuppu.

Lõpuks saate kustutada autori (d) tabelist Autorid DELETE-meetodi abil, kasutades järgmisi samme:

  • Veenduge, et teie märk oleks endiselt jaotises päised. Saate kontrollida päiste vahekaarti, et veenduda, et vajalik teave on paigas.
  • Sisestage nupu Saada kõrval see URL http://127.0.0.1/sam
  • Seejärel vajutage valitud kasutaja kustutamiseks saatmisnuppu.

Täieliku lähtekoodi leiate saidilt Github.  Saate selle kloonida ja seda oma arvutis kontrollida.

Sildid:

  • 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