×

Tạo hệ thống đăng nhập và bảo mật hai lớp (2FA) trong Python

Xây Dựng Hệ Thống Đăng Nhập Kết Hợp Bảo Mật Hai Lớp (2FA) Bằng Python

Việc đảm bảo an toàn cho tài khoản người dùng luôn là một trong những mối quan tâm hàng đầu của các nhà phát triển ứng dụng và website. Bài viết này sẽ hướng dẫn bạn cách xây dựng một hệ thống đăng nhập với bảo mật hai lớp (2FA) sử dụng ngôn ngữ lập trình Python.

Bước 1: Thiết lập môi trường phát triển

Đầu tiên, bạn cần cài đặt một số gói thư viện cần thiết. Các thư viện bao gồm Flask (một web framework đơn giản và phổ biến trong Python), SQLAlchemy để quản lý cơ sở dữ liệu và PyOTP để tạo mã 2FA.

pip install Flask SQLAlchemy pyotp

Bước 2: Xây dựng cấu trúc dự án

Dưới đây là cấu trúc thư mục gợi ý cho dự án của bạn:

.
├── app.py
├── models.py
├── templates
│   ├── login.html
│   ├── verify.html
└── static

Bước 3: Xây dựng tệp models.py

Tạo tệp models.py để định nghĩa cấu trúc dữ liệu trong cơ sở dữ liệu.

from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(150), unique=True, nullable=False)
    password = db.Column(db.String(150), nullable=False)
    otp_secret = db.Column(db.String(16), nullable=False)

    def set_password(self, password):
        self.password = generate_password_hash(password, method='sha256')

    def check_password(self, password):
        return check_password_hash(self.password, password)

db.create_all()

Bước 4: Tạo tệp app.py

Tạo tệp app.py để xử lý logic ứng dụng và giao tiếp với người dùng.

from flask import Flask, render_template, request, redirect, url_for, session
from models import db, User
import pyotp

app = Flask(__name__)
app.secret_key = 'super secret key'

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        otp_secret = pyotp.random_base32()
        new_user = User(username=username, otp_secret=otp_secret)
        new_user.set_password(password)
        db.session.add(new_user)
        db.session.commit()
        return redirect(url_for('login'))
    return render_template('register.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        user = User.query.filter_by(username=username).first()
        if user and user.check_password(password):
            session['username'] = username
            return redirect(url_for('verify'))
    return render_template('login.html')

@app.route('/verify', methods=['GET', 'POST'])
def verify():
    if request.method == 'POST':
        token = request.form['token']
        username = session.get('username')
        user = User.query.filter_by(username=username).first()
        if user:
            totp = pyotp.TOTP(user.otp_secret)
            if totp.verify(token):
                return f'Logged in successfully as {username}'
    return render_template('verify.html')

if __name__ == '__main__':
    app.run(debug=True)

Bước 5: Xây dựng giao diện người dùng

Để hoàn thiện hệ thống, bạn cần tạo các tệp HTML trong thư mục templates.

login.html
<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <form method="POST">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required>
        <button type="submit">Login</button>
    </form>
</body>
</html>
verify.html
<!DOCTYPE html>
<html>
<head>
    <title>Verify</title>
</head>
<body>
    <form method="POST">
        <label for="token">Authentication Code:</label>
        <input type="text" id="token" name="token" required>
        <button type="submit">Verify</button>
    </form>
</body>
</html>
register.html
<!DOCTYPE html>
<html>
<head>
    <title>Register</title>
</head>
<body>
    <form method="POST">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required>
        <button type="submit">Register</button>
    </form>
</body>
</html>

Kết luận

Qua bài viết này, bạn đã học cách xây dựng một hệ thống đăng nhập kết hợp với bảo mật hai lớp (2FA) sử dụng Python. Điều này giúp tăng cường an toàn cho người dùng và bảo vệ các tài khoản khỏi các cuộc tấn công. Việc áp dụng 2FA không chỉ giúp bảo vệ dữ liệu mà còn nâng cao sự tin tưởng của người dùng đối với ứng dụng của bạn.

Comments