Tanuljuk meg, hogyan lehet REST API-t biztosítani a JSON web tokenekkel, hogy megakadályozzuk a felhasználókat és a harmadik féltől származó alkalmazásokat annak visszaélésén.


Építünk egy adatbázis szolgáltatást a következő használatával SQLite és lehetővé teszi a felhasználók számára, hogy egy REST API-n keresztül férjen hozzá ehhez olyan HTTP módszerekkel, mint a POST és a PUT.

Ezen felül megismerjük, hogy a JSON web tokenek miért megfelelő módszer a pihenő API-k védelmére az emésztés és az alapvető hitelesítés helyett. Mielőtt folytatnánk, értsük meg a JSON web tokenek, a REST API és a Flask keret fogalmát.

JSON web tokenek

JSON web token, más néven JWT, a véletlenszerű tokenek biztonságos átvitele két fél vagy entitás között. A JSON általában három részből áll, mint az alábbiak.

  • Hasznos teher
  • Fejléc
  • Aláírás

A JSON kétféle típusú struktúrát használ az adatok vagy információk két fél közötti továbbítására.

  • szerializált
  • Deserialized

A sorosított űrlapot akkor kell használni, amikor az adatok a hálózatra továbbítódnak minden kérés és válasz során, míg a megérdemeltelt űrlapot használják az adatok olvasására és az internetes tokenre való írására..

A sorosított formában három összetevő van.

  • Fejléc
  • Hasznos teher
  • Aláírás

A fejléc összetevő meghatározza a tokenek kriptográfiai információit. Például:

  • Aláírt vagy aláíratlan JWT?
  • Definiálja az algoritmus technikáit

A szérializált forma, a sorosított formától eltérően, két összetevőt tartalmaz.

  • Hasznos teher
  • Fejléc

REST API

Az API (alkalmazásprogramozási felület) lehetővé teszi két alkalmazás közötti kommunikációt az adatok visszakeresése vagy benyújtása céljából. Két népszerű API típus létezik – a webes és a rendszer API.

Ebben a cikkben csak a webes API-t vizsgáljuk. Kétféle webes API létezik.

  • Kérés – Válasz API: Nyugalom, GraphQL, Távoli eljáráshívás (RPC)
  • Eseményvezérelt API: WebHooks, webes aljzatok, HTTP streaming

A REST API a kérelem-válasz kategóriába tartozik. Olyan HTTP módszereket használ, mint a GET, POST és PUT az API műveletek végrehajtásához.

Klasszikus példa az, amikor a felhasználó GET metódust küld a webszolgáltatásnak egy adott erőforrás vagy erőforrás-gyűjtemény kérésére vagy lekérésére. A kiszolgáló ezután visszaküldi az adott erőforrást vagy az erőforrások gyűjteményét a felhasználót, aki azt kérte.

Lombik keret

A lombik pythonon alapuló keret. Ez egy mikrokeret, amelyet a python fejlesztők használnak a többi API létrehozásához. Mikrokeretnek hívják, mert lehetővé teszi például a fejlesztők számára, hogy egyéni hitelesítést és bármilyen más háttérrendszert hozzáadjanak a preferenciák alapján..

Kezdjük a megvalósítással. A rendszerbeállításom a következő.

  • Ubuntu mint operációs rendszer
  • Python 2.7+
  • Postás

Állítson be virtuális környezetet a virtualenv használatával

Be kell állítanunk egy virtuális környezetet annak biztosítása érdekében, hogy egyes csomagok ne ütközzenek a rendszercsomagokkal. Használjuk a virtualenv szoftvert egy új virtuális környezet beállításához.

Feltéve, hogy a pip parancs elérhető a rendszeren, futtassa a következő parancsot a pip segítségével a telepítéshez.

pip install virtualenv

Ha nincs pipja a gépeden, akkor kövesse ezt dokumentáció a pip telepítéséhez a rendszerre.

Ezután hozzunk létre egy könyvtárat virtuális környezetünk tárolására vagy tárolására. Használja az alább látható mkdir parancsot egy könyvtár létrehozásához

mkdir flaskproject

Váltson a flaskproject könyvtárba a következő paranccsal

cd flaskproject

A flaskproject könyvtárban használja a virtualenv eszközt egy virtuális környezet létrehozásához, az alább látható módon:

virtualenv flaskapi

Miután a virtuualenv eszközt felhasználta a virtuális környezet létrehozására, futtassa a cd parancsot a flaskapi könyvtárba való váltáshoz virtuális környezetként, és aktiválja azt az alábbi paranccsal.

forrás-tároló / aktiválás

Végezzen el minden, a projekthez kapcsolódó feladatot a virtuális környezetben.

Telepítse a csomagokat a pip segítségével

Itt az ideje, hogy telepítsünk olyan csomagokat, mint a lombik keret és a PyJWT, amelyeket felhasználunk a többi API és más szükséges csomagok felépítéséhez API-projektünk számára.

Hozzon létre a követelmények.txt fájlt a következő csomagokkal.

Kulacs
dátum idő
uuid
Lombik-sqlalchemy
PyJWT

Telepítse őket pip-sel.

pip install -r követelmények.txt

Állítson be egy adatbázist

Telepítsük az SQLite-t.

apt-get install sqlite3

Hozzon létre egy adatbázist, amelynek neve a könyvtár. Ezen az adatbázison belül két táblát hozunk létre, nevezetesen a Felhasználók és a Szerzők táblát.

A Felhasználói táblázat tartalmazza a regisztrált felhasználókat. Csak a regisztrált felhasználók férhetnek hozzá a Szerzők táblához.

A szerzők táblája a szerzők adatait vagy részleteit, például a szerző nevét, születési országát és így tovább tárolja, amelyet a regisztrált felhasználók nyújtottak be.

Hozza létre az adatbázist a következő paranccsal:

sqlite3 library.db

Az alábbi paranccsal ellenőrizheti, hogy sikeresen létrehozta-e az adatbázist:

.adatbázisok

Nyisson meg egy új terminált, és hajtsa végre a következőket a korábban létrehozott virtuális környezetben.

érintse meg az app.py lehetőséget

Illessze be a következő kódot az app.py nevű fájlba

a lombikból importált lombik, kérés, jsonify, make_response
from flask_sqlalchemy import SQLAlchemy
a werkzeug.security importálásból generálja a jelszó_hát, ellenőrizze a jelszót_hash
import uuid
import jwt
import naptári idő
a functools importcsomagolások

A fenti kód első sora olyan csomagokat importál, mint a request és a jsonify. A kérést felhasználva nyomon követjük a kérés szintű adatokat egy kérés során, és a jsonify segítségével válaszokat adunk ki egy JSON formátum.

A következő sorban az SQLAlchemy-t importáltuk a flask_sqlalchemy-ből annak érdekében, hogy az SQLAlchemy-funkciókat integráljuk a lombikba.

A werkzeug.security webhelyről importáltuk ageneral_password_hash elemet a jelszó-kivonat létrehozásához a felhasználók számára, és a check_password_hash elemeztük a felhasználói jelszó ellenőrzéséhez, amikor összehasonlítottuk a felhasználók által megadott jelszót a felhasználók által az adatbázisban tárolt jelszavakkal..

Végül importáltuk a uuidet, amely univerzális egyedi azonosítóként is ismert, hogy véletlenszerű azonosítókat generáljon a felhasználók számára.

Ennek ellenére az app.py fájlban hajtsa végre a könyvtár API konfigurációs beállításait az app.py fájlban található alábbi kód használatával.

Helyezze a következő kódot az importálási nyilatkozat alá.

app = Lombik (__ név__)

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

db = SQLAlchemy (alkalmazás)

Most készítsen két modellt a Felhasználók és a szerzők táblázathoz, az alább látható módon. Másolja és illessze be a kódot az app.py fájlba.

Helyezze a kódot jobbra az adatbázis alá, db = SQLAlchemy (alkalmazás)

osztály felhasználók (db.Model):
id = db.Oszlop (db.Integer, Primary_key = True)
public_id = db.Oszlop (db.Integer)
név = db.Oszlop (db.String (50))
jelszó = db.Oszlop (db.String (50))
admin = db.Oszlop (db.Boolean)
osztály szerzői (db.Model):
id = db.Oszlop (db.Integer, Primary_key = True)
név = db.Oszlop (db.String (50), egyedi = igaz, érvénytelen = hamis))
könyv = db.Oszlop (db.String (20), egyedi = igaz, érvénytelen = hamis))
ország = db.Oszlop (db.String (50), elhagyható = hamis))
booker_prize = db.Oszlop (db.Boolean)

Felhasználók és szerzők tábláinak létrehozása

A terminálon írja be a következő kódot a virtuális környezetbe, hogy táblákat hozzon létre vagy hozzon létre mind a Felhasználók, mind a Szerzők táblázatokhoz, az alábbiak szerint

az alkalmazás importálásáról db
db.create_all ()

Ezután nyissa meg az app.py fájlt a virtuális környezetben, és hozzon létre egy másik funkciót.

Ez a funkció tokeneket generál annak érdekében, hogy csak a regisztrált felhasználók férhessenek hozzá és végrehajtsanak egy API műveletkészletet a Szerzők táblázattal szemben.

Helyezze ezt a kódot a Szerzők táblázat adatbázismodelljére

def token_required (f):
@wraps (f)
def dekorátor (* args, ** kwargs):

token = Nincs

ha az „x-access-token” a request.head fejlécekben:
token = request.headers [‘x-access-token’]

ha nem token:
return jsonify ({‘üzenet’: ‘hiányzik egy érvényes token’})

próbálja meg:
data = jwt.decode (token, app.config [SECRET_KEY])
current_user = Users.query.filter_by (public_id = data [‘public_id’]). első ()
kivéve:
return jsonify ({‘üzenet’: ‘a token érvénytelen’})

visszatérés f (aktuális_felhasználó, * íg, ** kwarg)
visszatér dekorátor

Hozzon létre útvonalakat a felhasználói táblázathoz

Hozzunk létre egy útvonalat, amellyel a felhasználók regisztrálhatnak a Szerzők API-ban felhasználónév és jelszó segítségével, az alább látható módon.

Ismét nyissa meg az app.py fájlt a virtuális környezetben, és illessze be a következő kódot a token_required (f) függvény alá

@ app.route (‘/ register’, módszerek = [‘GET’, ‘POST’])
def signup_user ():
data = request.get_json ()

hashed_password = generator_password_hash (adatok [‘jelszó’], módszer = ‘sha256’)

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

return jsonify ({‘üzenet’: ‘sikeresen regisztrálva’})

A virtuális környezetben hozzon létre egy másik útvonalat az app.py fájlban a regisztrált felhasználók bejelentkezéshez.

Amikor a felhasználó bejelentkezik, véletlenszerű token jön létre a felhasználó számára a könyvtár API eléréséhez.

Illessze be a kódot az előző által létrehozott útvonal alá.

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

auth = request.authorization

ha nem auth vagy nem auth.username vagy nem auth.password:
return make_response (‘nem sikerült ellenőrizni’, 401, {‘WWW.Authentication’: ‘Alap birodalom: "Bejelentkezés Szükséges"„})

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

ha check_password_hash (user.password, auth.password):
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 (‘nem sikerült ellenőrizni’, 401, {‘WWW.Authentication’: ‘Alap birodalom: "Bejelentkezés Szükséges"„})

Ennek ellenére a virtuális környezetben hozzon létre egy másik útvonalat az app.py fájlban az összes regisztrált felhasználó lekéréséhez vagy letöltéséhez.

Ez a kód minden regisztrált felhasználót ellenőrzi a Felhasználók táblában, és a végső eredményt JSON formátumban adja vissza.

Illessze be az alábbi kódot a bejelentkezési útvonal alá

@ app.route (‘/ felhasználók’, módszerek = [‘GET’])
def get_all_users ():

users = Users.query.all ()

eredmény = []

felhasználók számára:
user_data = {}
user_data [‘public_id’] = user.public_id
felhasználói_adatok [‘név’] = felhasználónév
felhasználói_adatok [‘jelszó’] = felhasználói jelszó
user_data [‘admin’] = user.admin

result.append (user_data)

return jsonify ({‘felhasználók’: eredmény})

Hozzon létre útvonalakat a szerzők táblájához 

Hozzunk létre útvonalakat a Szerzők táblázathoz, hogy a felhasználók az adatbázisban szereplő összes szerzőt visszakereshessék, és a szerzőket törölhessék.

Csak az érvényes tokenekkel rendelkező felhasználók végezhetik el ezeket az API műveleteket.

Az app.py fájlon belül hozzon létre egy utat a regisztrált felhasználók számára új szerzők létrehozásához.

Illessze be ezt a kódot az útvonal alá, amely lehetővé teszi a felhasználó számára az összes regisztrált felhasználó letöltését.

@ app.route (‘/ szerző’, módszerek = [‘POST’, ‘GET’])
@token_required
def create_author (current_user):

data = request.get_json ()

new_authors = Szerzők (név = adatok [‘név’], ország = adatok [‘ország’], könyv = adatok [‘könyv’], booker_prize = True, user_id = current_user.id)
db.session.add (new_authors)
db.session.commit ()

return jsonify ({‘üzenet’: ‘új szerző létrehozva’})

Ezután hozzon létre egy másik útvonalat, hogy egy érvényes tokennel rendelkező regisztrált felhasználó lehetővé tegye az összes szerző lekérését a szerzők táblázatból, az alább látható módon.

Illessze be ezt a kódot az útvonal alá, amely lehetővé teszi a felhasználó számára, hogy új szerzőt hozzon létre.

@ app.route (‘/ szerzők’, módszerek = [‘POST’, ‘GET’])
@token_required
def get_authors (current_user):

szerzők = Authors.query.filter_by (user_id = current_user.id) .all ()

output = []
szerzőkre írókban:

author_data = {}
szerző_data [‘név’] = szerző neve
author_data [‘könyv’] = szerző.könyv
szerző_data [‘ország’] = szerző ország
szerző_data [‘booker_prize’] = szerző.booker_prize
output.append (author_data)

return jsonify ({‘list_of_authors’: output})

Végül, továbbra is az app.py fájlban, hozzon létre egy utat egy megadott szerző törléséhez, az alább látható módon.

Illessze be ezt a kódot az útvonal alá, amely lehetővé teszi a felhasználó számára a szerzők listájának beolvasását.

@ app.route (‘/ szerzők /’, módszerek = [‘TÖRLÉS’])
@token_required
def delete_author (aktuális_felhasználó, szerző_id):
szerző = szerző.query.filter_by (id = szerző_id, felhasználó_id = aktuális_felhasználó.id) .first ()
ha nem szerző:
return jsonify ({‘üzenet’: ‘a szerző nem létezik’})

db.session.delete (szerző)
db.session.commit ()

return jsonify ({‘üzenet’: ‘szerző törölve’})

ha __name__ == ‘__main__’:
app.run (debug = True)

Ezután mentse el és zárja be az app.py fájlt a virtuális környezetben.

A könyvtár API tesztelése a Postman segítségével

Ebben a szakaszban egy postás eszköz használatával kérést küldünk az adatbázis-szolgáltatásokhoz. Ha még nincs postás a gépeden, megtudhatja, hogyan töltheti le és telepítheti itt.

A postáson kívül más eszközöket is használhatunk, például Curl kérések küldése a szerverre.

Nyisson meg egy új terminált, és írja be a következőt:

postás

A postás parancs hatására a böngésző megjeleníti az alábbi oldalt:

postman_signup

Dönthet úgy, hogy feliratkozik és létrehoz egy ingyenes fiókot, de kihagyjuk és közvetlen hozzáférést biztosítunk az alkalmazáshoz a könyvtár API teszteléséhez, az alább látható módon:

Tesztelje a könyvtár api-ját

Ebben a szakaszban megengedjük a felhasználónak, hogy regisztráljon a könyvtár API-jába, felhasználói név és egyedi jelszó megadásával JSON formátumban, a POST módszer alkalmazásával, az alábbi lépések végrehajtásával:

  • Kattintson a Test fülre
  • Ezután válassza ki a nyers gombot, és válassza a JSON formátumot
  • írja be a felhasználónevet és a jelszót a képernyőképen látható regisztrációhoz
  • A küldés gomb mellett írja be a következő URL-t: http://127.0.0.1/register
  • Végül változtassa meg a módszert POST-ra és nyomja meg a küldés gombot.

a felhasználó regisztrál egy alkalmazást

A következő kimenetet jeleníti meg, az alább látható módon:

Most sikeresen regisztráltunk egy felhasználót. Tegyük fel, hogy az éppen regisztrált felhasználónak lehetővé váljon a belépés, hogy ideiglenes véletlenszerű tokent készítsen a Szerzők táblázathoz a következő lépések segítségével:

  •  Kattintson az engedélyezési fülre.
  • A típus szakaszban válassza az alapvető hitelesítést.
  • Ezután töltse ki a felhasználónevet és a jelszót az előzőleg regisztrált felhasználónévvel és jelszóval.
  • Végül nyomja meg a küldés gombot a bejelentkezéshez és egy véletlenszerű token létrehozásához.

Miután a felhasználó sikeresen bejelentkezett, véletlenszerű token jön létre a felhasználó számára, a képernyőképen látható módon.

A létrehozott véletlenszerű tokent használjuk a Szerzők táblázat eléréséhez.

Ebben a szakaszban a szerzők adatait hozzáadjuk a Szerzők táblázatához a POST módszerrel, a következő lépések segítségével:

  • Kattintson a fejlécek fülre
  • Helyezze be a képernyőképen látható alábbi HTTP-fejléceket

  • Ezután kattintson a test fülre, és írja be az új szerző adatait
  • Ezután nyomja meg a küldés gombot a szerző adatainak a szerző táblázatához történő hozzáadásához

A szerzők adatait a Szerzők táblázatban is lekérheti az alábbiakon keresztül:

  • Győződjön meg arról, hogy a generált token a fejléc szakaszban található. ha nincs ott, akkor töltse ki azt tokenjével.
  • A küldés gomb mellett írja be ezt az URL-t http://127.0.0.1/authors
  • Ezután változtassa meg a HTTP módszert GET-re, és nyomja meg a küldés gombot a szerzők adatainak lekéréséhez.

Végül törölheti a szerzőket a Szerzők táblából a TÖRLÉS módszerrel a következő lépések segítségével:

  • Győződjön meg arról, hogy a token továbbra is a fejlécek szakaszban található. Ellenőrizheti a fejlécek fület, hogy megbizonyosodjon arról, hogy a szükséges információk a helyükön vannak-e.
  • A küldés gomb mellett írja be ezt az URL-t http://127.0.0.1/sam
  • Ezután nyomja meg a küldés gombot a megadott felhasználó törléséhez.

A teljes forráskódot a következő oldalon találhatja meg Github.  Klónozhatja és ellenőrizheti a számítógépen.

CÍMKÉK:

  • Piton

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me