Flaskda noldan xavfsiz va mustahkam foydalanuvchi kirish tizimini quring. Loyihani sozlash, parollarni xeshlash, sessiyalarni boshqarish va ilg'or xavfsizlik amaliyotlari haqida bilib oling.
Flask autentifikatsiyasi: Xavfsiz foydalanuvchi tizimlarini yaratish bo'yicha keng qamrovli qo'llanma
Bugungi raqamli dunyoda deyarli har bir jiddiy veb-ilova foydalanuvchilarini boshqarish va aniqlash usulini talab qiladi. Siz ijtimoiy tarmoq, elektron tijorat platformasi yoki korporativ intranet qurayotgan bo'lsangiz ham, xavfsiz va ishonchli autentifikatsiya tizimi shunchaki bir xususiyat emas, balki asosiy talabdir. Bu foydalanuvchi ma'lumotlarini himoya qiluvchi, tajribalarni shaxsiylashtiruvchi va ishonchni ta'minlovchi raqamli darvozabondir.
Ommabop Python mikro-freymvorki bo'lgan Flask kuchli veb-ilovalar yaratish uchun moslashuvchanlikni ta'minlaydi, ammo u autentifikatsiya amalga oshirishni ishlab chiquvchiga qoldiradi. Bu minimalistik yondashuv kuchli jihat bo'lib, sizni ma'lum bir metodologiyaga bog'lab qo'ymasdan, ish uchun eng yaxshi vositalarni tanlashga imkon beradi. Biroq, bu tizimni to'g'ri va xavfsiz qurish mas'uliyati sizda ekanligini ham anglatadi.
Ushbu keng qamrovli qo'llanma xalqaro ishlab chiquvchilar auditoriyasi uchun mo'ljallangan. Biz sizga Flaskda to'liq, ishlab chiqarishga tayyor foydalanuvchi kirish tizimini qurishning har bir bosqichini ko'rsatamiz. Biz mutlaqo asosiy bilimlardan boshlab, yo'lda muhim xavfsizlik amaliyotlarini qamrab olgan holda mustahkam yechimni bosqichma-bosqich yaratamiz. Ushbu qo'llanma oxirida siz o'zingizning Flask loyihalaringizda xavfsiz foydalanuvchi ro'yxatdan o'tish, kirish va sessiyalarni boshqarish uchun bilim va kodga ega bo'lasiz.
Old shartlar: Ishlab chiqish muhitingizni sozlash
Autentifikatsiya kodining birinchi qatorini yozishdan oldin, toza va tartibli ishlab chiqish muhitini yaratishimiz kerak. Bu dasturiy ta'minotni ishlab chiqishdagi universal eng yaxshi amaliyot bo'lib, loyihangizning bog'liqliklari tizimingizdagi boshqa loyihalar bilan to'qnashmasligini ta'minlaydi.
1. Python va virtual muhitlar
Tizimingizda Python 3.6 yoki undan yangiroq versiyasi o'rnatilganligiga ishonch hosil qiling. Loyihamiz paketlarini ajratish uchun virtual muhitdan foydalanamiz. Terminalingizni yoki buyruq satrini oching va quyidagi buyruqlarni kiriting:
# Loyiha katalogini yarating
mkdir flask-auth-project
cd flask-auth-project
# Virtual muhitni yarating ('venv' papkasi)
python3 -m venv venv
# Virtual muhitni faollashtiring
# macOS/Linuxda:
source venv/bin/activate
# Windowsda:
venv\Scripts\activate
Buyruq satringiz oldida `(venv)` yozuvi paydo bo'lganda muhit faol ekanligini bilasiz.
2. Asosiy Flask kengaytmalarini o'rnatish
Bizning autentifikatsiya tizimimiz ajoyib, yaxshi saqlangan Flask kengaytmalarining to'plami asosida quriladi. Har biri ma'lum bir maqsadga xizmat qiladi:
- Flask: Asosiy veb-freymvork.
- Flask-SQLAlchemy: Ma'lumotlar bazamiz bilan Pythonik tarzda o'zaro aloqa qilish uchun Ob'ekt-Relatsion Xaritalash (ORM).
- Flask-Migrate: Ma'lumotlar bazasi sxemasini migratsiyasini boshqaradi.
- Flask-WTF: Veb-formalar bilan ishlashni soddalashtiradi, validatsiya va CSRF himoyasini ta'minlaydi.
- Flask-Login: Foydalanuvchi sessiyasini boshqaradi, kirish, chiqish va foydalanuvchilarni eslab qolishni hal qiladi.
- Flask-Bcrypt: Kuchli parollarni xeshlash imkoniyatlarini ta'minlaydi.
- python-dotenv: Konfiguratsiya uchun muhit o'zgaruvchilarini boshqaradi.
Ularning barchasini bitta buyruq bilan o'rnating:
pip install Flask Flask-SQLAlchemy Flask-Migrate Flask-WTF Flask-Login Flask-Bcrypt python-dotenv
1-qism: Asos – Loyiha tuzilmasi va ma'lumotlar bazasi modeli
Yaxshi tashkil etilgan loyihani saqlash, kengaytirish va tushunish osonroq. Biz umumiy Flask ilova fabrika namunasidan foydalanamiz.
Kengaytiriladigan loyiha tuzilmasini loyihalash
flask-auth-project katalogingiz ichida quyidagi katalog va fayl tuzilmasini yarating:
/flask-auth-project
|-- /app
| |-- /static
| |-- /templates
| | |-- base.html
| | |-- index.html
| | |-- login.html
| | |-- register.html
| | |-- dashboard.html
| |-- __init__.py
| |-- models.py
| |-- forms.py
| |-- routes.py
|-- .env
|-- config.py
|-- run.py
- /app: Ilova mantiqini o'z ichiga olgan asosiy paket.
- /templates: HTML fayllarimizni saqlaydi.
- __init__.py: Flask ilovamizni ishga tushiradi (ilova fabrikasi).
- models.py: Ma'lumotlar bazasi jadvallarimizni belgilaydi (masalan, Foydalanuvchi modeli).
- forms.py: Flask-WTF yordamida ro'yxatdan o'tish va kirish formalarini belgilaydi.
- routes.py: Ko'rinish funksiyalarimizni o'z ichiga oladi (turli URL manzillar uchun mantiq).
- config.py: Ilova konfiguratsiya sozlamalarini saqlaydi.
- run.py: Veb-serverni ishga tushirish uchun asosiy skript.
- .env: Maxfiy kalitlar kabi muhit o'zgaruvchilarini saqlash uchun fayl (bu faylni versiyani boshqarish tizimiga kiritmaslik kerak).
Flask ilovangizni sozlash
Keling, konfiguratsiya fayllarimizni to'ldiraylik.
.env fayli:
Ushbu faylni loyihangizning ildiz katalogida yarating. Bu yerda biz sezgir ma'lumotlarni saqlaymiz.
SECRET_KEY='a-very-strong-and-long-random-secret-key'
DATABASE_URL='sqlite:///site.db'
MUHIM: SECRET_KEY qiymatini o'zingizning uzun, tasodifiy va bashorat qilib bo'lmaydigan qatoringiz bilan almashtiring. Bu kalit foydalanuvchi sessiyalarini himoya qilish uchun juda muhimdir.
config.py fayli:
Ushbu fayl konfiguratsiyani .env faylimizdan o'qiydi.
import os
from dotenv import load_dotenv
basedir = os.path.abspath(os.path.dirname(__file__))
load_dotenv(os.path.join(basedir, '.env'))
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY')
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
Flask-SQLAlchemy bilan foydalanuvchi modelini yaratish
Foydalanuvchi modeli bizning autentifikatsiya tizimimizning yuragi. U ma'lumotlar bazamizdagi users jadvalining tuzilmasini belgilaydi.
app/models.py:
from flask_login import UserMixin
from . import db, login_manager
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128), nullable=False)
def __repr__(self):
return f'<User {self.username}>'
Keling, buni tushuntirib beraylik:
UserMixin: BuFlask-Loginsinfi bo'lib, uis_authenticated,is_activekabi usullar uchun umumiy implementatsiyalarni o'z ichiga oladi, bu bizning Foydalanuvchi modelimizga kerak.@login_manager.user_loader: Bu funksiyaFlask-Loginuchun talabdir. U sessiyada saqlangan foydalanuvchi identifikatori orqali foydalanuvchi ob'ektini qayta yuklash uchun ishlatiladi. Flask-Login har bir so'rovda tizimga kirgan foydalanuvchi uchun ushbu funksiyani chaqiradi.password_hash: E'tibor bering, biz parolni to'g'ridan-to'g'ri saqlamaymiz. Bizpassword_hashni saqlaymiz. Bu autentifikatsiyadagi eng muhim xavfsizlik tamoyillaridan biridir. Parollarni oddiy matn shaklida saqlash katta xavfsizlik zaifligidir. Agar ma'lumotlar bazangizga buzilish bo'lsa, tajovuzkorlar har bir foydalanuvchining parollariga ega bo'ladi. Xeshni saqlash orqali siz ularga asl parollarni olishni hisoblash nuqtai nazaridan imkonsiz qilasiz.
Ilovani ishga tushirish
Endi, keling, hamma narsani ilova fabrikamizga bog'laylik.
app/__init__.py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from config import Config
db = SQLAlchemy()
bcrypt = Bcrypt()
login_manager = LoginManager()
login_manager.login_view = 'main.login' # Tizimga kirmagan foydalanuvchilar uchun yo'naltirish sahifasi
login_manager.login_message_category = 'info' # Xabarlar uchun Bootstrap sinfi
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
db.init_app(app)
bcrypt.init_app(app)
login_manager.init_app(app)
from .routes import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
run.py:
from app import create_app, db
from app.models import User
app = create_app()
@app.shell_context_processor
def make_shell_context():
return {'db': db, 'User': User}
if __name__ == '__main__':
app.run(debug=True)
Ilovani ishga tushirishdan oldin, ma'lumotlar bazasini yaratishimiz kerak. Terminalda faollashtirilgan virtual muhitingizdan quyidagi buyruqlarni ishga tushiring:
flask shell
>>> from app import db
>>> db.create_all()
>>> exit()
Bu sizning ildiz katalogingizda site.db faylini yaratadi, u biz belgilagan user jadvalini o'z ichiga oladi.
2-qism: Asosiy autentifikatsiya mantig'ini yaratish
Asosiy poydevor yaratilganidan so'ng, endi foydalanuvchilar uchun qismlarni: ro'yxatdan o'tish va kirish formalarini hamda ularni qayta ishlaydigan marshrutlarni yaratishimiz mumkin.
Foydalanuvchini ro'yxatdan o'tkazish: Yangi foydalanuvchilarni xavfsiz ro'yxatdan o'tkazish
Birinchidan, biz Flask-WTF yordamida formani belgilaymiz.
app/forms.py:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from .models import User
class RegistrationForm(FlaskForm):
username = StringField('Foydalanuvchi nomi',
validators=[DataRequired(), Length(min=2, max=20)])
email = StringField('Elektron pochta',
validators=[DataRequired(), Email()])
password = PasswordField('Parol', validators=[DataRequired()])
confirm_password = PasswordField('Parolni tasdiqlash',
validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Ro'yxatdan o'tish')
def validate_username(self, username):
user = User.query.filter_by(username=username.data).first()
if user:
raise ValidationError('Bu foydalanuvchi nomi band. Iltimos, boshqasini tanlang.')
def validate_email(self, email):
user = User.query.filter_by(email=email.data).first()
if user:
raise ValidationError('Bu elektron pochta allaqachon ro'yxatdan o'tgan. Iltimos, boshqasini tanlang.')
class LoginForm(FlaskForm):
email = StringField('Elektron pochta',
validators=[DataRequired(), Email()])
password = PasswordField('Parol', validators=[DataRequired()])
remember = BooleanField('Meni eslab qol')
submit = SubmitField('Kirish')
Nisbiy validatorlarga validate_username va validate_email e'tibor bering. Flask-WTF validate_<field_name> naqshiga mos keladigan har qanday usulni avtomatik ravishda chaqiradi va uni ushbu maydon uchun maxsus validator sifatida ishlatadi. Biz foydalanuvchi nomi yoki elektron pochta allaqachon ma'lumotlar bazasida mavjudligini shu tarzda tekshiramiz.
Keyin, ro'yxatdan o'tishni boshqarish uchun marshrutni yaratamiz.
app/routes.py:
from flask import Blueprint, render_template, url_for, flash, redirect, request
from .forms import RegistrationForm, LoginForm
from .models import User
from . import db, bcrypt
from flask_login import login_user, current_user, logout_user, login_required
main = Blueprint('main', __name__)
@main.route('/')
@main.route('/index')
def index():
return render_template('index.html')
@main.route('/register', methods=['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('main.index'))
form = RegistrationForm()
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
user = User(username=form.username.data, email=form.email.data, password_hash=hashed_password)
db.session.add(user)
db.session.commit()
flash('Sizning hisobingiz yaratildi! Endi siz tizimga kirishingiz mumkin', 'success')
return redirect(url_for('main.login'))
return render_template('register.html', title='Ro'yxatdan o'tish', form=form)
Flask-Bcrypt bilan parollarni xeshlash
Yuqoridagi kodning eng muhim qatori:
hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
Bcrypt zamonaviy, adaptiv xeshlash algoritmiga ega. U foydalanuvchi parolini oladi va uning ustida murakkab, hisoblash jihatidan qimmat bo'lgan bir tomonlama transformatsiyani amalga oshiradi. Shuningdek, u har bir parol uchun tasodifiy "tuz"ni o'z ichiga oladi, bu "rainbow table" hujumlarining oldini oladi. Bu shuni anglatadiki, hatto ikkita foydalanuvchining parollari bir xil bo'lsa ham, ularning saqlangan xeshlari butunlay boshqacha bo'ladi. Natijada olingan xeshni biz ma'lumotlar bazasida saqlaymiz. Ushbu jarayonni teskari qilish va asl parolni olish deyarli imkonsizdir.
Foydalanuvchini kirish: Mavjud foydalanuvchilarni autentifikatsiya qilish
Endi app/routes.py faylimizga kirish marshrutini qo'shamiz.
app/routes.py (ushbu marshrutni qo'shing):
@main.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
return redirect(url_for('main.index'))
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user and bcrypt.check_password_hash(user.password_hash, form.password.data):
login_user(user, remember=form.remember.data)
next_page = request.args.get('next')
return redirect(next_page) if next_page else redirect(url_for('main.index'))
else:
flash('Kirish muvaffaqiyatsiz. Iltimos, elektron pochta va parolni tekshiring', 'danger')
return render_template('login.html', title='Kirish', form=form)
Bu yerdagi asosiy qadamlar:
- Foydalanuvchini topish: Biz yuborilgan elektron pochta manzili bo'yicha ma'lumotlar bazasida foydalanuvchini qidiramiz.
- Parolni tekshirish: Bu muhim tekshiruv:
bcrypt.check_password_hash(user.password_hash, form.password.data). Ushbu funksiya ma'lumotlar bazamizdagi saqlangan xeshni va foydalanuvchi kiritgan oddiy matnli parolni oladi. U yuborilgan parolni bir xil tuz yordamida (xeshning bir qismi sifatida saqlanadi) qayta xeshladi va natijalarni solishtiradi. Agar ular mos kelsa, uTrueqiymatini qaytaradi. Bu bizga saqlangan xeshni dekodlashga hech qachon ehtiyoj sezmasdan parolni tekshirish imkonini beradi. - Sessiyani boshqarish: Agar parol to'g'ri bo'lsa, biz
login_user(user, remember=form.remember.data)funksiyasini chaqiramiz.Flask-Logindagi bu funksiya foydalanuvchini tizimga kirgan deb ro'yxatga oladi, uning identifikatorini foydalanuvchi sessiyasida (xavfsiz, server tomonidagi cookie) saqlaydi.rememberargumenti "Meni eslab qol" funksiyasini boshqaradi.
Foydalanuvchidan chiqish: Sessiyani xavfsiz tugatish
Chiqish oddiy. Bizga faqat Flask-Loginning logout_user funksiyasini chaqiradigan marshrut kerak.
app/routes.py (ushbu marshrutni qo'shing):
@main.route('/logout')
def logout():
logout_user()
return redirect(url_for('main.index'))
Ushbu funksiya foydalanuvchining identifikatorini sessiyadan tozalaydi va ularni tizimdan samarali ravishda chiqaradi.
3-qism: Marshrutlarni himoyalash va foydalanuvchi sessiyalarini boshqarish
Endi foydalanuvchilar tizimga kirib va chiqishlari mumkin bo'lganligi sababli, ularning autentifikatsiyalangan holatidan foydalanishimiz kerak.
@login_required bilan kontentni himoyalash
Ko'plab sahifalar, masalan, foydalanuvchi paneli yoki hisob sozlamalari, faqat tizimga kirgan foydalanuvchilar uchun mavjud bo'lishi kerak. Flask-Login buni @login_required dekoratori bilan juda osonlashtiradi.
Keling, himoyalangan panel marshrutini yarataylik.
app/routes.py (ushbu marshrutni qo'shing):
@main.route('/dashboard')
@login_required
def dashboard():
return render_template('dashboard.html', title='Panel')
Shu! Agar tizimga kirmagan foydalanuvchi /dashboardga kirishga harakat qilsa, Flask-Login so'rovni avtomatik ravishda to'xtatadi va ularni kirish sahifasiga yo'naltiradi (biz buni app/__init__.py faylida login_manager.login_view = 'main.login' bilan sozlaganmiz). Muvaffaqiyatli kirishdan so'ng, u ularni aslida kirishga harakat qilgan panel sahifasiga aqlli tarzda qayta yo'naltiradi.
Joriy foydalanuvchi ma'lumotlariga kirish
Marshrutlaringiz va shablonlaringiz ichida Flask-Login current_user deb nomlangan sehrli proksi-ob'ektni ta'minlaydi. Ushbu ob'ekt faol so'rov uchun hozirda tizimga kirgan foydalanuvchini ifodalaydi. Agar hech qanday foydalanuvchi tizimga kirmagan bo'lsa, u anonim foydalanuvchi ob'ekti bo'lib, current_user.is_authenticated False bo'ladi.
Buni Python kodingizda ishlatishingiz mumkin:
# Marshrutda
if current_user.is_authenticated:
print(f'Salom, {current_user.username}!')
Va siz uni Jinja2 shablonlaringizda ham to'g'ridan-to'g'ri ishlatishingiz mumkin:
<!-- base.html kabi shablonlarda -->
{% if current_user.is_authenticated %}
<a href="{{ url_for('main.dashboard') }}">Panel</a>
<a href="{{ url_for('main.logout') }}">Chiqish</a>
{% else %}
<a href="{{ url_for('main.login') }}">Kirish</a>
<a href="{{ url_for('main.register') }}">Ro'yxatdan o'tish</a>
{% endif %}
Bu sizga foydalanuvchining kirish holatiga qarab navigatsiya panelini yoki UI ning boshqa qismlarini dinamik ravishda o'zgartirish imkonini beradi.
HTML shablonlari
To'liqlik uchun, app/templates katalogiga joylashtirishingiz mumkin bo'lgan ba'zi asosiy shablonlar. Ular oddiy HTML dan foydalanadi, lekin Bootstrap yoki Tailwind CSS kabi freymvork bilan osongina integratsiya qilinishi mumkin.
base.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }} - Flask Auth App</title>
</head>
<body>
<nav>
<a href="{{ url_for('main.index') }}">Bosh sahifa</a>
{% if current_user.is_authenticated %}
<a href="{{ url_for('main.dashboard') }}">Panel</a>
<a href="{{ url_for('main.logout') }}">Chiqish</a>
{% else %}
<a href="{{ url_for('main.login') }}">Kirish</a>
<a href="{{ url_for('main.register') }}">Ro'yxatdan o'tish</a>
{% endif %}
</nav>
<hr>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
<div class="alert-{{ category }}">{{ message }}</div>
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>
register.html / login.html (ro'yxatdan o'tish formasidan misol):
{% extends "base.html" %}
{% block content %}
<div>
<form method="POST" action="">
{{ form.hidden_tag() }}
<fieldset>
<legend>Bugun qo'shiling</legend>
<div>
{{ form.username.label }}
{{ form.username() }}
</div>
<div>
{{ form.email.label }}
{{ form.email() }}
</div>
<div>
{{ form.password.label }}
{{ form.password() }}
</div>
<div>
{{ form.confirm_password.label }}
{{ form.confirm_password() }}
</div>
</fieldset>
<div>
{{ form.submit() }}
</div>
</form>
</div>
{% endblock content %}
4-qism: Ilg'or mavzular va xavfsizlik bo'yicha eng yaxshi amaliyotlar
Biz qurgan tizim mustahkam, ammo ishlab chiqarish darajasidagi ilova ko'proq narsani talab qiladi. Mana muhim keyingi qadamlar va xavfsizlik masalalari.
1. Parolni tiklash funksiyasi
Foydalanuvchilar parollarini unutishi muqarrar. Xavfsiz parolni tiklash oqimi juda muhim. Standart, xavfsiz jarayon:
- Foydalanuvchi "Parolni unutdingizmi" sahifasida elektron pochta manzilini kiritadi.
- Ilova xavfsiz, bir martalik, vaqtga sezgir tokenni yaratadi.
itsdangerouskutubxonasi (Flask bilan o'rnatilgan) buning uchun juda mos keladi. - Ilova foydalanuvchiga ushbu token bilan havolani o'z ichiga olgan elektron pochta xabarini yuboradi.
- Foydalanuvchi havolani bosganda, ilova tokenni tasdiqlaydi (uning haqiqiyligi va amal qilish muddatini tekshiradi).
- Agar haqiqiy bo'lsa, foydalanuvchiga yangi parolni kiritish va tasdiqlash uchun forma ko'rsatiladi.
Hech qachon foydalanuvchining eski parolini yoki yangi oddiy matnli parolini elektron pochta orqali yubormang.
2. Ro'yxatdan o'tishda elektron pochtani tasdiqlash
Foydalanuvchilarni soxta elektron pochta manzillari bilan ro'yxatdan o'tishdan himoya qilish va ular bilan bog'lanishingizga ishonch hosil qilish uchun siz elektron pochtani tasdiqlash qadamini amalga oshirishingiz kerak. Jarayon parolni tiklashga juda o'xshash: token yaratish, tasdiqlash havolasini elektron pochta orqali yuborish va tokenni tasdiqlaydigan va foydalanuvchi hisobini ma'lumotlar bazasida tasdiqlangan deb belgilaydigan marshrutga ega bo'lish.
3. Brute-Force hujumlarining oldini olish uchun tezlikni cheklash
Brute-force hujumi – bu tajovuzkor kirish formasida turli parollarni qayta-qayta sinab ko'rishidir. Buni yumshatish uchun siz tezlikni cheklashni amalga oshirishingiz kerak. Bu ma'lum bir vaqt oralig'ida (masalan, daqiqada 5 ta muvaffaqiyatsiz urinish) bitta IP-manzildan kirish urinishlari sonini cheklaydi. Flask-Limiter kengaytmasi buning uchun ajoyib vositadir.
4. Barcha maxfiy ma'lumotlar uchun muhit o'zgaruvchilaridan foydalanish
Biz buni SECRET_KEY va DATABASE_URL uchun allaqachon qildik, bu ajoyib. Bu xavfsizlik va ko'chirish qobiliyati uchun muhim amaliyotdir. .env faylingizni yoki qattiq kodlangan ma'lumotlar (masalan, API kalitlari yoki ma'lumotlar bazasi parollari) bo'lgan har qanday faylni GitHub kabi ommaviy versiyani boshqarish tizimiga hech qachon joylashtirmang. Ularni istisno qilish uchun har doim .gitignore faylidan foydalaning.
5. Saytlararo so'rovlarni soxtalashtirish (CSRF) himoyasi
Yaxshi yangilik! Flask-WTFdan foydalangan holda va formalarimizga {{ form.hidden_tag() }}ni kiritish orqali biz allaqachon CSRF himoyasini yoqdik. Bu yashirin teg har bir forma yuborish uchun noyob token yaratadi, bu so'rovning sizning haqiqiy saytingizdan kelayotganligini ta'minlaydi va foydalanuvchilaringizni aldashga urinayotgan zararli tashqi manbadan emasligini tasdiqlaydi.
Xulosa: Flask autentifikatsiyasida keyingi qadamlaringiz
Tabriklaymiz! Siz Flaskda to'liq va xavfsiz foydalanuvchi autentifikatsiya tizimini muvaffaqiyatli yaratdingiz. Biz butun hayot siklini qamrab oldik: kengaytiriladigan loyihani sozlash, ma'lumotlar bazasi modelini yaratish, parollarni xeshlash bilan foydalanuvchini xavfsiz ro'yxatdan o'tkazish, foydalanuvchilarni autentifikatsiya qilish, Flask-Login yordamida sessiyalarni boshqarish va marshrutlarni himoyalash.
Endi siz har qanday Flask loyihasiga ishonch bilan integratsiya qilishingiz mumkin bo'lgan mustahkam poydevorga egasiz. Esda tutingki, xavfsizlik bir martalik sozlash emas, balki doimiy jarayondir. Biz muhokama qilgan tamoyillar – ayniqsa parollarni xeshlash va maxfiy kalitlarni himoya qilish – foydalanuvchi ma'lumotlarini ishlatadigan har qanday ilova uchun majburiy hisoblanadi.
Bu yerdan siz ilovangizni yanada yaxshilash uchun autentifikatsiyaning yanada ilg'or mavzularini o'rganishingiz mumkin:
- Rolga asoslangan kirishni boshqarish (RBAC): Oddiy foydalanuvchilar va administratorlarga turli ruxsatnomalar berish uchun Foydalanuvchi modelingizga
rolemaydonini qo'shing. - OAuth integratsiyasi: Foydalanuvchilarga Google, GitHub yoki Facebook kabi uchinchi tomon xizmatlari yordamida tizimga kirishga ruxsat bering.
- Ikki faktorli autentifikatsiya (2FA): Autentifikator ilovasi yoki SMS orqali kodni talab qilish orqali qo'shimcha xavfsizlik qatlamini qo'shing.
Autentifikatsiya asoslarini o'zlashtirish orqali siz professional veb-ishlab chiquvchi sifatidagi sayohatingizda sezilarli qadam tashladingiz. Baxtli kodlash!