Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Trang Chủ Hướng Dẫn Đồ Án Xử lý đăng ký, xác nhận tài khoản bằng email trong PHP
Hướng Dẫn Đồ ÁnLập Trình Web

Xử lý đăng ký, xác nhận tài khoản bằng email trong PHP

Chia sẻ
Chia sẻ

Trong mọi hệ thống web hiện đại, việc đăng ký tài khoảnxác thực qua email là bước quan trọng để bảo mật và tạo sự tin tưởng với người dùng. Khi một người dùng mới đăng ký, hệ thống cần gửi email chứa đường link xác nhận để đảm bảo rằng địa chỉ email này thực sự thuộc về họ. Chỉ sau khi xác nhận thành công, tài khoản mới được kích hoạt và có thể sử dụng.

Tại sao đây là bước cần thiết? Bởi nếu bỏ qua xác minh email, bạn có thể gặp tình trạng: người dùng dùng email giả mạo, bot tự động tạo tài khoản ảo, hoặc spam đăng ký để phá hoại hệ thống. Do đó, xác nhận tài khoản qua email vừa tăng cường bảo mật, vừa nâng cao trải nghiệm người dùng.

Để triển khai trọn vẹn chức năng này, bạn cần kết hợp nhiều kiến thức đã học từ các bài viết trước:

Trong bài viết này, mình sẽ hướng dẫn chi tiết toàn bộ quy trình xử lý đăng ký và xác thực tài khoản bằng email với PHP + MySQL, bao gồm: tạo form đăng ký, lưu dữ liệu, sinh token xác nhận, gửi email bằng PHPMailer, xử lý link xác nhận, và kích hoạt tài khoản.

Kiến trúc hệ thống đăng ký và xác thực

Trước khi đi vào code, hãy hình dung kiến trúc tổng thể:

  1. Người dùng đăng ký → nhập username, email, mật khẩu.
  2. Hệ thống lưu thông tin vào DB với trạng thái inactive và sinh một token ngẫu nhiên.
  3. PHPMailer gửi email chứa đường link xác nhận (kèm token).
  4. Người dùng click link → hệ thống kiểm tra token.
  5. Nếu hợp lệ → cập nhật trạng thái user thành active, tài khoản sẵn sàng sử dụng.

Với luồng này, bạn vừa đảm bảo chỉ những email thật mới được kích hoạt, vừa chống spam hiệu quả.

Tạo bảng users với trường statusverify_token

Đầu tiên, bạn cần một bảng trong MySQL để lưu thông tin user. Ngoài các trường cơ bản như id, username, email, password, chúng ta cần thêm:

  • status: để lưu trạng thái tài khoản (inactive hoặc active).

  • verify_token: để lưu chuỗi token gửi kèm email xác nhận.

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    status ENUM('inactive', 'active') DEFAULT 'inactive',
    verify_token VARCHAR(64) DEFAULT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Cấu trúc này đơn giản nhưng đủ để thực hiện xác nhận email. Khi đăng ký, status mặc định là inactiveverify_token sẽ chứa chuỗi ngẫu nhiên.

Tạo form đăng ký người dùng

Tiếp theo, ta cần một form HTML để người dùng nhập thông tin. Form này nên bao gồm các trường: username, email, password, confirm password. Ngoài ra, bạn có thể thêm validate cơ bản ở frontend bằng JavaScript, nhưng phần quan trọng nhất vẫn là validate server-side trong PHP.

<form method="post" action="register.php">
  <p><label>Username:<br><input type="text" name="username" required></label></p>
  <p><label>Email:<br><input type="email" name="email" required></label></p>
  <p><label>Password:<br><input type="password" name="password" required></label></p>
  <p><label>Confirm Password:<br><input type="password" name="confirm_password" required></label></p>
  <button type="submit">Đăng ký</button>
</form>

Form này gửi dữ liệu POST tới file register.php, nơi chúng ta sẽ xử lý logic đăng ký và gửi email xác nhận.

Xử lý đăng ký và lưu thông tin vào database

Khi người dùng gửi form, ta cần validate dữ liệu, hash mật khẩu, sinh token xác nhận, và lưu vào DB.

<?php
require 'vendor/autoload.php'; // autoload PHPMailer & PDO
$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8", "root", "");

// Nhận dữ liệu từ form
$username = trim($_POST['username']);
$email = trim($_POST['email']);
$password = $_POST['password'];
$confirm = $_POST['confirm_password'];

// Kiểm tra mật khẩu trùng khớp
if ($password !== $confirm) {
    die("Mật khẩu không trùng khớp");
}

// Hash mật khẩu
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);

// Sinh token xác nhận
$token = bin2hex(random_bytes(32));

// Lưu vào DB với status = inactive
$stmt = $pdo->prepare("INSERT INTO users (username, email, password, verify_token) VALUES (?, ?, ?, ?)");
$stmt->execute([$username, $email, $hashedPassword, $token]);

// Gửi email xác nhận
$verifyLink = "http://yourdomain.com/verify.php?token=" . $token;

Trong đoạn code trên:

  • password_hash() đảm bảo mật khẩu an toàn.

  • bin2hex(random_bytes(32)) sinh token ngẫu nhiên, đủ mạnh để tránh đoán.

  • Sau khi lưu DB, ta chuẩn bị link xác nhận gửi cho user.

Gửi email xác nhận bằng PHPMailer

Sau khi có link xác nhận, ta dùng PHPMailer để gửi email. Đây là phần đã hướng dẫn chi tiết trong bài Gửi email bằng PHPMailer trong PHP.

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer(true);
try {
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'your-email@gmail.com';
    $mail->Password = 'your-app-password';
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
    $mail->Port = 587;

    $mail->setFrom('your-email@gmail.com', 'Your Website');
    $mail->addAddress($email, $username);

    $mail->isHTML(true);
    $mail->Subject = 'Xác nhận tài khoản của bạn';
    $mail->Body = "Xin chào $username,<br>Vui lòng click vào link sau để xác nhận tài khoản:<br><a href='$verifyLink'>$verifyLink</a>";

    $mail->send();
    echo "Đăng ký thành công. Vui lòng kiểm tra email để xác nhận tài khoản.";
} catch (Exception $e) {
    echo "Không thể gửi email. Lỗi: {$mail->ErrorInfo}";
}

Email này sẽ chứa link xác nhận, khi user click vào, họ sẽ được đưa đến verify.php.

Xử lý link xác nhận trong verify.php

Khi người dùng click link trong email, hệ thống cần kiểm tra token trong DB. Nếu token tồn tại và hợp lệ, ta đổi status từ inactive sang active.

<?php
$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8", "root", "");
$token = $_GET['token'] ?? '';

$stmt = $pdo->prepare("SELECT * FROM users WHERE verify_token = ?");
$stmt->execute([$token]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    $stmt = $pdo->prepare("UPDATE users SET status = 'active', verify_token = NULL WHERE id = ?");
    $stmt->execute([$user['id']]);
    echo "Tài khoản của bạn đã được xác nhận thành công.";
} else {
    echo "Token không hợp lệ hoặc đã được sử dụng.";
}

Ở đây, ta đảm bảo rằng token chỉ sử dụng một lần (sau khi xác nhận sẽ set về NULL). Điều này ngăn chặn việc lạm dụng link cũ.

Tích hợp với hệ thống đăng nhập

Sau khi tài khoản đã xác thực, người dùng có thể đăng nhập bình thường. Ở bước đăng nhập, ta cần kiểm tra status. Nếu inactive, hiển thị thông báo yêu cầu xác nhận email trước.

$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user && password_verify($password, $user['password'])) {
    if ($user['status'] === 'active') {
        $_SESSION['user_id'] = $user['id'];
        echo "Đăng nhập thành công.";
    } else {
        echo "Tài khoản chưa được xác nhận. Vui lòng kiểm tra email.";
    }
} else {
    echo "Sai email hoặc mật khẩu.";
}

Điều này đảm bảo rằng chỉ những tài khoản đã xác minh mới có quyền truy cập hệ thống.

Các lưu ý bảo mật

  • Sử dụng password_hash và password_verify thay cho md5/sha1.

  • Token phải ngẫu nhiên và đủ dài, tránh bị đoán.

  • Xác nhận email trước khi cho phép đăng nhập, tránh spam.

  • Link xác nhận nên có thời hạn (ví dụ 24h), có thể thêm trường token_expires vào DB.

  • PHPMailer nên dùng App Password hoặc SMTP riêng, không dùng mật khẩu email chính.

  • Escape dữ liệu output (htmlspecialchars) để tránh XSS khi hiển thị thông tin user.

Kết luận

Qua bài viết này, bạn đã nắm được cách xây dựng hệ thống đăng ký và xác nhận tài khoản bằng email trong PHP. Chúng ta đã đi qua các bước: tạo bảng users, form đăng ký, hash mật khẩu, sinh token, gửi email xác nhận bằng PHPMailer, xử lý verify link, và tích hợp với đăng nhập.

Khi kết hợp với các module đã học như CRUD trong PHP, Session, password_hash, bạn có thể dễ dàng mở rộng thành một hệ thống user management hoàn chỉnh, bảo mật và chuyên nghiệp.

Tham Gia Nhóm – Hỗ Trợ Lập Trình

Hỗ Trợ Đồ Án – ThueDoAn.vn

Liên quan
Hướng Dẫn Đồ Án

Checklist 10 bước kiểm tra cuối cùng trước khi nhấn nút nộp đồ án

Thời điểm chuẩn bị nhấn nút nộp đồ án luôn mang lại...

Hướng Dẫn Đồ Án

Tuyệt chiêu đối phó với những giảng viên hướng dẫn ‘khó tính’ nhất

Giai đoạn làm đồ án tốt nghiệp luôn đi kèm với vô...

Hướng Dẫn Đồ Án

Tại sao việc quản lý Source Code bằng Git lại quan trọng hơn bạn nghĩ?

Trong thế giới lập trình hiện đại, mã nguồn chính là linh...

Hướng Dẫn Đồ Án

Những chức năng ‘thừa’ khiến bạn tốn thời gian mà không được cộng điểm

Làm đồ án tốt nghiệp là một cuộc đua thực thụ với...

Hướng Dẫn Đồ Án

Cách xử lý khi đề tài bị trùng lặp ý tưởng với các khóa trước quá nhiều

Lựa chọn đề tài đồ án luôn là bước khởi đầu đầy...

Hướng Dẫn Đồ Án

Làm sao để giải trình với giảng viên khi code bị nghi ngờ là đi chép?

Trong quá trình thực hiện đồ án, việc tham khảo mã nguồn...

Hướng Dẫn Đồ Án

Cảnh báo: Những nguồn share code ‘rác’ trên mạng cần tuyệt đối tránh

Trong quá trình làm đồ án, việc tìm kiếm sự hỗ trợ...

Hướng Dẫn Đồ Án

Sai lầm khi chọn công nghệ quá khó so với năng lực thực tế của bản thân

Chọn đề tài và công nghệ cho đồ án luôn là bước...

Liên Hệ
Liên hệ để được tư vấn & hỗ trợ đồ án CNTT nhé bạn!