Webové tokeny JSON sa ľahko používajú a ladia, no zároveň ponúkajú pôsobivé zvýšenie bezpečnosti.
Nefunkčná autentifikácia je aj naďalej pretrvávajúcou zraniteľnosťou v moderných webových aplikáciách – stále patrí medzi 10 najlepších bezpečnostných rizík API OWASP.
Účinky tejto zraniteľnosti môžu byť vážne. Môžu poskytnúť neoprávnený prístup k citlivým údajom a ohroziť integritu systému. Ak chcete efektívne zabezpečiť bezpečný prístup k aplikáciám a ich zdrojom, je dôležité, aby ste používali robustné mechanizmy autentifikácie.
Zistite, ako môžete implementovať autentifikáciu používateľov vo Flasku pomocou JSON Web Tokens (JWT), populárnej a efektívnej metódy založenej na tokenoch.
Autentifikácia na základe tokenov pomocou webových tokenov JSON
Autentifikácia založená na tokenoch používa zašifrovaný reťazec znakov na overenie a autorizáciu prístupu k systému alebo prostriedku. Tento typ autentifikácie môžete implementovať pomocou rôznych metód vrátane tokenov relácie, kľúčov API a webových tokenov JSON.
Najmä JWT ponúkajú bezpečný a kompaktný prístup na prenos požadovaných používateľských poverení medzi aplikáciami na strane klienta a servermi.
JWT pozostáva z troch hlavných komponentov: hlavičky, užitočného zaťaženia a podpisu. Hlavička obsahuje metadáta o tokene vrátane hašovacieho algoritmu použitého na kódovanie tokenu.
Užitočné zaťaženie obsahuje skutočné používateľské poverenia, ako napríklad ID používateľa a povolenia. Nakoniec podpis zaisťuje platnosť tokenu overením jeho obsahu pomocou tajného kľúča.
Pomocou JWT môžete autentifikovať používateľov a ukladať dáta relácie všetko v rámci samotného tokenu.
Nastavte projekt Flask a databázu MongoDB
Ak chcete začať, vytvorte nový adresár projektu pomocou terminálu:
mkdir flask-project
cd flask-projekt
Ďalej nainštalujte virtualenv, na vytvorenie lokálneho virtuálneho vývojového prostredia pre váš projekt Flask.
virtualenv venv
Nakoniec aktivujte virtuálne prostredie.
# Unix alebo MacOS:
zdroj venv/bin/activate
# Windows:
.\venv\Scripts\activate
Kód tohto projektu nájdete v tomto úložisko GitHub.
Nainštalujte požadované balíky
V koreňovom adresári priečinka projektu vytvorte nový request.txt súbor a pridajte tieto závislosti pre projekt:
banke
pyjwt
python-dotenv
pymongo
bcrypt
Nakoniec spustite príkaz uvedený nižšie a nainštalujte balíky. Uistite sa, že máte pip (správca balíkov) nainštalovaný; Ak nie, nainštalujte ho do systému Windows, Mac alebo Linux.
pip install -r requirements.txt
Vytvorte databázu MongoDB
Pokračujte a vytvorte databázu MongoDB. Môžeš nastaviť lokálnu databázu MongoDB, prípadne, vytvorte klaster na MongoDB Atlas, cloudovej službe MongoDB.
Po vytvorení databázy skopírujte URI pripojenia, vytvorte a .env súbor v koreňovom adresári vášho projektu a pridajte ho takto:
MONGO_URI=""
Nakoniec nakonfigurujte pripojenie k databáze z vašej aplikácie Flask. Vytvorte nový utils/db.py súbor v koreňovom adresári vášho projektu s týmto kódom:
od pymongo importovať MongoClient
defconnect_to_mongodb(mongo_uri):
klient = MongoClient (mongo_uri)
db = client.get_database("používatelia")
vrátiť db
Táto funkcia vytvorí pripojenie k databáze MongoDB pomocou poskytnutého identifikátora URI pripojenia. Potom vytvorí nový používateľov kolekciu, ak neexistuje, a vráti zodpovedajúcu inštanciu databázy.
Vytvorte webový server Flask
S nakonfigurovanou databázou pokračujte a vytvorte súbor app.py súbor v koreňovom adresári priečinka projektu a pridajte nasledujúci kód na vytvorenie inštancie aplikácie Flask.
od banke importovať Banka
od routes.user_auth importovať register_routes
od utils.db importovať connect_to_mongodb
importovať os
od dotenv importovať load_dotenvapp = Banka (__name__)
load_dotenv()mongo_uri = os.getenv(„MONGO_URI“)
db = connect_to_mongodb (mongo_uri)register_routes (aplikácia, db)
ak __meno__ == '__Hlavná__':
app.run (ladenie=Pravda)
Vytvorte koncové body rozhrania Authentication API
Na implementáciu autentifikácie používateľa vo vašej aplikácii Flask je dôležité definovať potrebné koncové body API, ktoré spracovávajú operácie súvisiace s autentifikáciou.
Najprv však definujte model pre údaje používateľov. Ak to chcete urobiť, vytvorte nový model/user_model.py súbor v koreňovom adresári a pridajte nasledujúci kód.
od pymongo.kolekcia importovať Zbierka
od bson.objectid importovať ObjectIdtriedaPoužívateľ:
def__init__(self, collection: Collection, username: str, password: str):
seba.zber = zber
self.username = používateľské meno
self.password = heslo
defuložiť(ja):
user_data = {
'používateľské meno': vlastné používateľské meno,
'heslo': vlastné.heslo
}
výsledok = self.collection.insert_one (user_data)
vrátiť str (result.inserted_id)@statická metóda
deffind_by_id(kolekcia: Collection, user_id: str):
vrátiť collection.find_one({'_id': ObjectId (user_id)})
@statická metóda
deffind_by_username(kolekcia: Collection, užívateľské meno: str):
vrátiť collection.find_one({'používateľské meno': používateľské meno})
Vyššie uvedený kód špecifikuje a Používateľ trieda, ktorá slúži ako dátový model a definuje niekoľko metód na interakciu s kolekciou MongoDB na vykonávanie operácií súvisiacich s používateľom.
- The uložiť metóda uloží nový užívateľský dokument so zadaným užívateľským menom a heslom do kolekcie MongoDB a vráti ID vloženého dokumentu.
- The find_by_id a find_by_username metódy získavajú užívateľské dokumenty z kolekcie na základe poskytnutého užívateľského ID alebo užívateľského mena, resp.
Definujte Autentifikačné cesty
- Začnime definovaním trasy registrácie. Táto trasa pridá nové používateľské údaje do zbierky používateľov MongoDB. V koreňovom adresári vytvorte nový routes/user_auth.py súbor a nasledujúci kód.
importovať jwt
od functools importovať zábaly
od banke importovať jsonify, request, make_response
od models.user_model importovať Používateľ
importovať bcrypt
importovať osdefregister_routes(aplikácia, db):
kolekcia = db.users
app.config[„SECRET_KEY“] = os.urandom(24)@app.route('/api/register', methods=['POST'])
defRegistrovať():
používateľské meno = request.json.get('používateľské meno')
heslo = request.json.get('heslo')
existujúci_používateľ = User.find_by_username (kolekcia, používateľské meno)
ak existujúci_používateľ:
vrátiť jsonify({'správa': 'Užívateľské meno už existuje!'})
hashed_password = bcrypt.hashpw (password.encode('utf-8'), bcrypt.gensalt())
new_user = Používateľ (kolekcia, používateľské meno, hashované_heslo.decode('utf-8'))
user_id = new_user.save()vrátiť jsonify({'správa': 'Používateľ sa úspešne zaregistroval!', 'ID používateľa': ID používateľa})
- Implementujte funkciu prihlasovania, aby ste zvládli proces autentifikácie a overili poverenia používateľa. Pod registračnú cestu pridajte nasledujúci kód.
Prihlasovací koncový bod robí dve veci: overuje dodané poverenia používateľa a po úspešnej autentifikácii vygeneruje pre tohto používateľa jedinečný JWT. Nastaví tento token ako súbor cookie v odpovedi spolu s užitočným zaťažením JSON označujúcim úspešné prihlásenie. Ak sú poverenia neplatné, vráti odpoveď JSON, ktorá to oznámi.@app.route('/api/login', methods=['POST'])
defPrihlásiť sa():
používateľské meno = request.json.get('používateľské meno')
heslo = request.json.get('heslo')
user = User.find_by_username (kolekcia, používateľské meno)
ak užívateľ:
ak bcrypt.checkpw (password.encode('utf-8'), používateľ['heslo'].encode('utf-8')):
token = jwt.encode({'ID používateľa': str (používateľ['_id'])}, app.config[„SECRET_KEY“], algoritmus='HS256')
odpoveď = make_response (jsonify({'správa': 'Prihlásenie úspešné!'}))
response.set_cookie('token', token)
vrátiť odpoveďvrátiť jsonify({'správa': 'Nesprávne užívateľské meno alebo heslo'})
- Definujte funkciu dekorátora, ktorá overuje webové tokeny JSON (JWT) odovzdané spolu s následnými požiadavkami rozhrania API. Pridajte kód uvedený nižšie v rámci register_routes blok funkčného kódu.
Táto funkcia dekorátora zabezpečuje prítomnosť platného tokenu JWT v nasledujúcich požiadavkách API. Skontroluje, či token chýba, jeho platnosť vypršala alebo je platný, a ak áno, vráti príslušnú odpoveď JSON.deftoken_required(f):
@wraps (f)
defzdobené(*args, **kwargs):
token = request.cookies.get('token')aknie token:
vrátiť jsonify({'správa': 'Chýba token!'}), 401skúste:
data = jwt.decode (token, app.config[„SECRET_KEY“], algoritmy=['HS256'])
current_user = User.find_by_id (kolekcia, údaje['ID používateľa'])
okrem jwt. ExpiredSignatureError:
vrátiť jsonify({'správa': 'Platnosť tokenu vypršala!'}), 401
okrem jwt. InvalidTokenError:
vrátiť jsonify({'správa': 'Neplatný Token!'}), 401vrátiť f (aktuálny_používateľ, *args, **kwargs)
vrátiť zdobené
- Nakoniec vytvorte chránenú trasu.
@app.route('/api/users', methods=['GET'])
@token_required
defget_users(súčasný užívateľ):
používatelia = zoznam (collection.find({}, {'_id': 0}))
vrátiť jsonify (používatelia)
Tento koncový bod spracováva logiku pre získavanie používateľských údajov z databázy, ale vyžaduje, aby klient odosielajúci požiadavky zahrnul platný token na prístup k údajom.
Nakoniec spustite príkaz uvedený nižšie, čím spustíte vývojový server.
flask run
Na otestovanie registrácie, prihlásenia a koncového bodu chránených používateľov môžete použiť Postman alebo akéhokoľvek iného klienta API. Žiadosti posielajte na http://localhost: 5000/api/a sledujte odpovede, aby ste si overili funkčnosť týchto koncových bodov API.
Je autentifikácia tokenu spoľahlivým bezpečnostným opatrením?
Webové tokeny JSON poskytujú robustný a efektívny spôsob overovania používateľov pre vašu webovú aplikáciu. Je však dôležité pochopiť, že autentifikácia pomocou tokenu nie je spoľahlivá; je to len jeden kúsok väčšej bezpečnostnej skladačky.
Skombinujte overenie pomocou tokenov s ďalšími osvedčenými postupmi zabezpečenia. Nezabudnite neustále monitorovať a prijať konzistentné bezpečnostné postupy; výrazne zvýšite celkovú bezpečnosť vašich aplikácií Flask.