A JSON Web Tokenek használata és hibakeresése egyszerű, ugyanakkor lenyűgöző biztonsági emelkedést is kínálnak.
A meghibásodott hitelesítés továbbra is a modern webalkalmazások tartós sebezhetősége – továbbra is előkelő helyen áll az OWASP 10 legfontosabb API biztonsági kockázata között.
Ennek a sebezhetőségnek a hatásai súlyosak lehetnek. Jogosulatlan hozzáférést biztosíthatnak az érzékeny adatokhoz, és veszélyeztethetik a rendszer integritását. Az alkalmazásokhoz és erőforrásaikhoz való biztonságos hozzáférés hatékony biztosítása érdekében létfontosságú, hogy robusztus hitelesítési mechanizmusokat használjon.
Ismerje meg, hogyan valósíthat meg felhasználói hitelesítést a Flaskban a JSON Web Tokens (JWT) segítségével, amely egy népszerű és hatékony token-alapú módszer.
Token alapú hitelesítés JSON webes tokenekkel
A token alapú hitelesítés egy titkosított karakterláncot használ a rendszerhez vagy erőforráshoz való hozzáférés ellenőrzéséhez és engedélyezéséhez. Az ilyen típusú hitelesítést különféle módszerekkel hajthatja végre, beleértve a munkamenet-jogkivonatokat, az API-kulcsokat és a JSON-webtokeneket.
A JWT-k különösen biztonságos és kompakt megközelítést kínálnak a szükséges felhasználói hitelesítő adatok továbbítására az ügyféloldali alkalmazások és szerverek között.
A JWT három fő összetevőből áll: a fejlécből, a hasznos terhelésből és az aláírásból. A fejléc metaadatokat tartalmaz a tokenről, beleértve a token kódolásához használt kivonatolási algoritmust.
A rakomány tartalmazza a tényleges felhasználói hitelesítő adatokat, például a felhasználói azonosítót és az engedélyeket. Végül az aláírás biztosítja a token érvényességét azáltal, hogy titkos kulcs segítségével ellenőrzi annak tartalmát.
A JWT-k használatával hitelesítheti a felhasználókat és tárolhatja a munkamenetadatokat magában a tokenben.
Állítson be egy lombikprojektet és egy MongoDB adatbázist
A kezdéshez hozzon létre egy új projektkönyvtárat egy terminál segítségével:
mkdir lombik-projekt
cd lombik-projekt
Ezután telepítse virtualenv, helyi virtuális fejlesztői környezet létrehozásához a Flask projekthez.
virtualenv venv
Végül aktiválja a virtuális környezetet.
# Unix vagy MacOS:
forrás venv/bin/activate
# Ablakok:
.\venv\Scripts\activate
A projekt kódját itt találja meg GitHub adattár.
Telepítse a szükséges csomagokat
A projektmappa gyökérkönyvtárában hozzon létre egy újat követelmények.txt fájlt, és adja hozzá ezeket a függőségeket a projekthez:
lombik
pyjwt
python-dotenv
pymongo
bcrypt
Végül futtassa az alábbi parancsot a csomagok telepítéséhez. Győződjön meg róla csipog (csomagkezelő) telepítve; ha nem, telepítse Windows, Mac vagy Linux rendszerére.
pip install -r követelmények.txt
Hozzon létre egy MongoDB adatbázist
Menjen előre, és hozzon létre egy MongoDB adatbázist. tudsz állítson be egy helyi MongoDB adatbázist, vagy hozzon létre egy fürtöt a MongoDB Atlason, egy felhőalapú MongoDB szolgáltatáson.
Miután létrehozta az adatbázist, másolja ki a kapcsolat URI-jét, és hozzon létre egy .env fájlt a projekt gyökérkönyvtárába, és a következőképpen adja hozzá:
MONGO_URI=""
Végül konfigurálja az adatbázis-kapcsolatot a Flask alkalmazásból. Újat csinálni utils/db.py fájlt a projekt gyökérkönyvtárában, ezzel a kóddal:
tól től pymongo import MongoClient
defconnect_to_mongodb(mongo_uri):
kliens = MongoClient (mongo_uri)
db = client.get_database("felhasználók")
Visszatérés db
Ez a funkció kapcsolatot létesít a MongoDB adatbázissal a megadott kapcsolati URI használatával. Ezután létrehoz egy újat felhasználókat gyűjteményt, ha nem létezik, és visszaadja a megfelelő adatbázispéldányt.
Hozza létre a Flask webszervert
Az adatbázis konfigurálásával folytassa, és hozzon létre egy app.py fájlt a projektmappa gyökérkönyvtárába, és adja hozzá a következő kódot a Flask alkalmazás példányának létrehozásához.
tól től lombik import Lombik
tól től routes.user_auth import register_routes
tól től utils.db import connect_to_mongodb
import os
tól től dotenv import load_dotenvapp = Lombik (__name__)
load_dotenv()mongo_uri = os.getenv("MONGO_URI")
db = connect_to_mongodb (mongo_uri)register_routes (app, db)
ha __név__ == '__fő__':
app.run (debug=Igaz)
Hozza létre az Authentication API végpontokat
A felhasználói hitelesítés megvalósításához a Flask alkalmazásban kulcsfontosságú a szükséges API-végpontok meghatározása, amelyek a hitelesítéssel kapcsolatos műveleteket kezelik.
Először azonban határozza meg a modellt a felhasználók adataihoz. Ehhez hozzon létre egy újat model/user_model.py fájlt a gyökérkönyvtárba, és adja hozzá a következő kódot.
tól től pymongo.gyűjtemény import Gyűjtemény
tól től bson.objektum import ObjectIdosztályFelhasználó:
def__benne__(saját, gyűjtemény: Gyűjtemény, felhasználónév: str, jelszó: str):
self.collection = gyűjtés
self.username = felhasználónév
self.password = jelszó
defmegment(maga):
user_data = {
'felhasználónév': self.username,
'Jelszó': saját.jelszó
}
eredmény = self.collection.insert_one (felhasználói_adatok)
Visszatérés str (eredmény.beszúrt_id)@staticmethod
deffind_by_id(gyűjtemény: Gyűjtemény, user_id: str):
Visszatérés collection.find_one({'_id': ObjectId (felhasználói_azonosító)})
@staticmethod
defkeresés_felhasználónév alapján(gyűjtemény: Gyűjtemény, felhasználónév: str):
Visszatérés collection.find_one({'felhasználónév': felhasználónév})
A fenti kód meghatározza a Felhasználó osztály, amely adatmodellként szolgál, és számos módszert határoz meg a MongoDB-gyűjteményekkel való interakcióhoz a felhasználókkal kapcsolatos műveletek végrehajtásához.
- A megment metódus elment egy új felhasználói dokumentumot a megadott felhasználónévvel és jelszóval a MongoDB gyűjteménybe, és visszaadja a beillesztett dokumentum azonosítóját.
- A find_by_id és keresés_felhasználónév alapján módszerek felhasználói dokumentumokat kérnek le a gyűjteményből a megadott felhasználói azonosító vagy felhasználónév alapján.
Határozza meg a hitelesítési útvonalakat
- Kezdjük a regisztrációs útvonal meghatározásával. Ez az útvonal új felhasználói adatokat ad hozzá a MongoDB felhasználói gyűjteményéhez. A gyökérkönyvtárban hozzon létre egy újat routes/user_auth.py fájlt és a következő kódot.
import jwt
tól től funkcionális eszközök import pakolások
tól től lombik import jsonify, request, make_response
tól től modellek.felhasználói_modell import Felhasználó
import bcrypt
import osdefregister_routes(app, db):
gyűjtemény = db.users
app.config['TITKOS KULCS'] = os.urandom(24)@app.route('/api/register', method=['POST'])
defRegisztráció():
felhasználónév = request.json.get('felhasználónév')
jelszó = request.json.get('Jelszó')
létező_felhasználó = User.find_by_username (gyűjtemény, felhasználónév)
ha létező felhasználó:
Visszatérés jsonify({'üzenet': 'Felhasználónév már létezik!'})
hashed_password = bcrypt.hashpw (password.encode("utf-8"), bcrypt.gensalt())
new_user = Felhasználó (gyűjtemény, felhasználónév, hashed_password.decode("utf-8"))
user_id = new_user.save()Visszatérés jsonify({'üzenet': 'A felhasználó sikeresen regisztrált!', 'Felhasználói azonosító': Felhasználói azonosító})
- Valósítsa meg a bejelentkezési funkciót a hitelesítési folyamat kezeléséhez és a felhasználói hitelesítő adatok ellenőrzéséhez. A regisztrációs útvonal alatt adja hozzá a következő kódot.
A bejelentkezési végpont két dolgot tesz: ellenőrzi a megadott felhasználói hitelesítő adatokat, és sikeres hitelesítés esetén egyedi JWT-t hoz létre a felhasználó számára. Ezt a tokent cookie-ként állítja be a válaszban, a sikeres bejelentkezést jelző JSON-adattartalommal együtt. Ha a hitelesítési adatok érvénytelenek, akkor JSON-választ ad vissza ennek jelzésére.@app.route('/api/login', method=['POST'])
defBelépés():
felhasználónév = request.json.get('felhasználónév')
jelszó = request.json.get('Jelszó')
user = User.find_by_username (gyűjtemény, felhasználónév)
ha felhasználó:
ha bcrypt.checkpw (password.encode("utf-8"), user['Jelszó'].kódol("utf-8")):
token = jwt.encode({'Felhasználói azonosító': str (felhasználó['_id'])}, app.config['TITKOS KULCS'], algoritmus="HS256")
válasz = make_response (jsonify({'üzenet': 'Sikeres bejelentkezés!'}))
response.set_cookie('jelképes', token)
Visszatérés válaszVisszatérés jsonify({'üzenet': 'Érvénytelen felhasználónév vagy jelszó'})
- Határozzon meg egy dekorációs funkciót, amely ellenőrzi az átadott JSON Web Tokeneket (JWT-k) a későbbi API-kérésekkel együtt. Adja hozzá az alábbi kódot a register_routes funkció kód blokk.
Ez a díszítő funkció biztosítja az érvényes JWT token jelenlétét a következő API-kérésekben. Ellenőrzi, hogy a token hiányzik-e, lejárt-e vagy érvényes-e, és megfelelő JSON-választ ad vissza, ha igen.deftoken_requiredf):
@wraps (f)
defdíszített(*args, **kwargs):
token = request.cookies.get('jelképes')hanem jelképes:
Visszatérés jsonify({'üzenet': – A token hiányzik!}), 401próbáld ki:
adatok = jwt.decode (token, app.config['TITKOS KULCS'], algoritmusok=["HS256"])
current_user = User.find_by_id (gyűjtemény, adat['Felhasználói azonosító'])
kivéve jwt. Expired SignatureError:
Visszatérés jsonify({'üzenet': 'A token lejárt!'}), 401
kivéve jwt. InvalidTokenError:
Visszatérés jsonify({'üzenet': 'Érvénytelen kód!'}), 401Visszatérés f (aktuális_felhasználó, *args, **kwargs)
Visszatérés díszített
- Végül hozzon létre egy védett útvonalat.
@app.route('/api/users', method=['GET'])
@token_required
defget_users(jelenlegi felhasználó):
user = lista (collection.find({}, {'_id': 0}))
Visszatérés jsonify (felhasználók)
Ez a végpont kezeli a felhasználói adatok adatbázisból való lekéréséhez szükséges logikát, de megköveteli, hogy a kérelmeket küldő ügyfél érvényes jogkivonatot tartalmazzon az adatok eléréséhez.
Végül futtassa az alábbi parancsot a fejlesztői kiszolgáló felpörgetéséhez.
lombik fut
A regisztráció, a bejelentkezés és a védett felhasználók végpontjának teszteléséhez használhatja a Postmant vagy bármely más API-klienst. Kérések küldése a címre http://localhost: 5000/api/és figyelje meg a válaszokat ezen API-végpontok működőképességének ellenőrzéséhez.
A token hitelesítés bolondbiztos biztonsági intézkedés?
A JSON Web Tokenek robusztus és hatékony módszert kínálnak a felhasználók hitelesítésére a webalkalmazásban. Fontos azonban megérteni, hogy a token hitelesítés nem bolondbiztos; ez csak egy darabja egy nagyobb biztonsági rejtvénynek.
A token hitelesítés kombinálása más biztonsági bevált gyakorlatokkal. Ne felejtse el folyamatosan figyelni, és következetes biztonsági gyakorlatokat alkalmazni; jelentősen megnöveli Flask alkalmazásai általános biztonságát.