Hướng dẫn
Quảng cáo

Cách Viết Mã PHP Cho Tính Năng "Nhớ Đăng Nhập" Trong PHP

Bài viết sẽ hướng dẫn chi tiết cách viết mã PHP để triển khai tính năng "Nhớ Đăng Nhập" giúp người dùng duy trì trạng thái đăng nhập trên website.

Tính năng "Nhớ Đăng Nhập" giúp người dùng không cần nhập lại thông tin đăng nhập mỗi khi truy cập trang web. Bài viết này sẽ hướng dẫn chi tiết cách triển khai tính năng này bằng PHP. Việc viết mã PHP cho tính năng Nhớ Đăng Nhập sẽ bao gồm các bước xử lý form, xác thực cookie, và đảm bảo an toàn.

Bước 1: Cập Nhật Form Đăng Nhập

Thêm checkbox "Nhớ Đăng Nhập" vào form đăng nhập.

Ví dụ

<form method="post" action="login.php">
    <input type="text" name="username" required placeholder="Tên đăng nhập">
    <input type="password" name="password" required placeholder="Mật khẩu">
    <input type="checkbox" name="remember_me" value="1"> Nhớ Đăng Nhập
    <button type="submit">Đăng nhập</button>
</form>

Bước 2: Xử Lý Form Đăng Nhập

Xử lý thông tin từ form đăng nhập và kiểm tra checkbox "Nhớ Đăng Nhập" thông qua tạo file php login.php với nội dung bên dưới:

Ví dụ

// login.php

session_start();
require 'db_connection.php'; // Giả sử bạn có file kết nối cơ sở dữ liệu

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $rememberMe = isset($_POST['remember_me']) ? $_POST['remember_me'] : '';

    // Lấy thông tin người dùng từ cơ sở dữ liệu
    $stmt = $conn->prepare('SELECT id, username, password FROM users WHERE username = ?');
    $stmt->bind_param('s', $username);
    $stmt->execute();
    $result = $stmt->get_result();
    $user = $result->fetch_assoc();

    if ($user && password_verify($password, $user['password'])) {
        // Người dùng xác thực thành công
        $_SESSION['user_id'] = $user['id'];

        if ($rememberMe) {
            // Tạo token duy nhất
            $token = bin2hex(random_bytes(16));
            $userId = $user['id'];
            $expires = time() + (86400 * 30); // 30 ngày

            // Lưu token vào cơ sở dữ liệu
            $stmt = $conn->prepare('INSERT INTO auth_tokens (user_id, token, expires) VALUES (?, ?, ?)');
            $stmt->bind_param('iss', $userId, $token, date('Y-m-d H:i:s', $expires));
            $stmt->execute();

            // Đặt token vào cookie
            setcookie('auth_token', $token, $expires, '/', '', true, true);
        }

        header('Location: dashboard.php');
    } else {
        echo "Tên đăng nhập hoặc mật khẩu không đúng.";
    }
}

Bước 3: Xác Thực Người Dùng Khi Tải Trang

Kiểm tra cookie "auth_token" và xác thực token qua file authenticate.php

Ví dụ

// authenticate.php

session_start();
require 'db_connection.php';

if (isset($_SESSION['user_id'])) {
    // Người dùng đã đăng nhập
    return;
}

if (isset($_COOKIE['auth_token'])) {
    $auth_token = $_COOKIE['auth_token']; // Lấy token từ cookie

    try {
        $db = getDB(); // Giả sử getDB() trả về một đối tượng PDO

        // Lấy token từ cơ sở dữ liệu
        $st = $db->prepare("SELECT UserID, Expires FROM AuthTokens WHERE Token=:token");
        $st->bindParam(":token", $auth_token, PDO::PARAM_STR);
        $st->execute();
        $auth = $st->fetch(PDO::FETCH_ASSOC);

        if ($auth && strtotime($auth['Expires']) > time()) {
            // Token hợp lệ
            $_SESSION['uid'] = $auth['UserID'];
            // Tùy chọn, cập nhật lại ngày hết hạn của token ở đây
        } else {
            // Token không hợp lệ hoặc đã hết hạn
            setcookie('auth_token', '', time() - 3600, '/', '', true, true); // Xóa cookie
        }
    } catch (PDOException $e) {
        // Xử lý lỗi
        echo "Lỗi: " . $e->getMessage();
    }
}

Bước 4: Đảm Bảo An Toàn

  • Bảo mật Cookie: Sử dụng các flag HttpOnlySecure cho cookie.
  • Tạo lại Token: Tùy chọn tạo lại token định kỳ để tăng cường bảo mật.
  • Đăng Xuất: Đảm bảo token bị xóa khi người dùng đăng xuất.

Ví dụ

// logout.php

session_start();
require 'db_connection.php';

if (isset($_SESSION['user_id'])) {
    // Xóa token xác thực từ cơ sở dữ liệu
    $stmt = $conn->prepare('DELETE FROM auth_tokens WHERE user_id = ?');
    $stmt->bind_param('i', $_SESSION['user_id']);
    $stmt->execute();
    
    // Hủy session và xóa cookie
    session_unset();
    session_destroy();
    setcookie('auth_token', '', time() - 3600, '/', '', true, true); // Xóa cookie

    header('Location: login.php');
}

Bước 5: Cấu Trúc Cơ Sở Dữ Liệu

Đảm bảo bạn có bảng để lưu token xác thực.

Ví dụ

CREATE TABLE auth_tokens (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    token VARCHAR(64) NOT NULL,
    expires DATETIME NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

Bằng cách làm theo các bước này, bạn có thể triển khai tính năng "Nhớ Đăng Nhập" một cách an toàn và hiệu quả trong hệ thống PHP của mình.

Bài viết này đã giúp ích cho bạn?

Bài viết mới

Advertisements