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.

instagram viewer

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_dotenv

app = 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 ObjectId

osztá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.

  1. 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.
  2. 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

  1. 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 os

    defregister_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ó})

  2. 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.
     @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álasz

    Visszatérés jsonify({'üzenet': 'Érvénytelen felhasználónév vagy jelszó'})

    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.
  3. 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.
    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!}), 401

    pró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!'}), 401

    Visszatérés f (aktuális_felhasználó, *args, **kwargs)

    Visszatérés díszített

    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.
  4. 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.