Tích hợp xác thực 2 yếu tố với Google Authenticator cho Laravel FrameWork

14:14 24/04/2024

Xác thực thông qua thông tin đăng nhập và mật khẩu từng được coi là tiêu chuẩn để nhận dạng người dùng và truy cập vào tài nguyên trên internet. Tuy nhiên, với sức mạnh tính toán ngày nay, các hacker có thể thử hàng tỷ kết hợp mật khẩu mỗi giây. Thêm vào đó, thống kê cho thấy 65% người dùng sử dụng cùng một mật khẩu – thường là mật khẩu đơn giản – cho nhiều tài khoản. Điều này làm cho việc đánh cắp hoặc tấn công mật khẩu thông qua brute-force trở nên dễ dàng hơn bao giờ hết.

Xác thực hai yếu tố (2FA) đã trở thành một phương pháp quan trọng để xác định danh tính người dùng. Trong 2FA, người dùng phải chứng minh hai yếu tố:

  • Điều họ biết – Thông tin đăng nhập và mật khẩu: Điều này đề cập đến những gì mà người dùng “biết” để xác minh danh tính của họ, thường là thông tin đăng nhập (tên người dùng, địa chỉ email) và mật khẩu mà họ đã tạo. Đây là thông tin mà người dùng đã chọn và nhập vào hệ thống.
  • Sở hữu – Các yếu tố sở hữu: Phần này liên quan đến những gì mà người dùng “sở hữu” và chỉ họ mới có, thường là một thiết bị hoặc thông tin cụ thể mà chỉ họ có thể truy cập. Ví dụ, trong trường hợp của chúng ta, Google Authenticator sẽ tạo ra một mã số ngẫu nhiên mỗi khi cần xác minh, và mã số này chỉ hiển thị trên điện thoại của người dùng, điều này có nghĩa là người dùng phải có điện thoại của họ để xác minh danh tính.

Trong bài viết này, chúng ta sẽ tìm hiểu cách triển khai xác thực hai yếu tố cho ứng dụng web bằng cách sử dụng Google Authenticator như một phương tiện sở hữu. Điều này không chỉ tăng cường bảo mật mà còn giúp người dùng cảm thấy an tâm hơn khi sử dụng dịch vụ trực tuyến.

TOTP (Thuật toán mật khẩu một lần dựa trên thời gian)

Dựa trên việc triển khai ứng dụng mẫu, tôi sử dụng thuật toán TOTP (Time-Based One-Time Password) của Google Authenticator. Thuật toán này tính toán một mật khẩu một lần từ một khóa bí mật chung và thời gian hiện tại. TOTP được mô tả và tiêu chuẩn hóa trong RFC 6238.

Ở đây, chúng ta sử dụng hàm tạo TOTP để tạo mã xác thực một lần. Điều này bao gồm việc sử dụng khóa bí mật chung (mà chỉ người dùng và hệ thống biết) và thời gian hiện tại để tạo ra một mã xác thực duy nhất vào mỗi khoảnh khắc. Nhờ vào tính chất này, mã xác thực sẽ thay đổi liên tục theo thời gian, cung cấp một phương tiện an toàn và độc lập thời gian để xác minh danh tính của người dùng.

Thực hiện

Bước 1: Khởi tạo.

Trước tiên, hãy đảm bảo rằng bạn đã cài đặt Laravel trên máy tính của mình. Bạn có thể sử dụng Composer để tạo một dự án Laravel mới:

Trong bản demo này, chúng ta sẽ sử dụng hai migrations mặc định của Laravel là CreateUsersTable và CreatePasswordResetsTable, nhưng thay vì chạy luôn migrate sau khi cấu hình database, chúng ta sẽ tạo một migration mới để thêm một cột là secret_code cho từng người dùng. Cột này sẽ lưu trữ mã bí mật được tạo ra bởi Authenticator (viết tắt là ứng dụng Google Authenticator). Mã bí mật này sẽ được sử dụng để xác minh danh tính cho các lần đăng nhập sau của người dung:

Thực hiện thêm cột trong file:

database/migrations/<timestamp>_add_secret_code_to_users.php:

Chúng ta chạy migrate bằng lệnh:

Chúng ta đã hoàn thành phần cấu hình cơ sở dữ liệu. Bây giờ, chúng ta sẽ chuyển sang phần Đăng ký và Đăng nhập. Trong bản demo này, chúng ta sẽ sử dụng Auth của Laravel. Để thực hiện điều này, trước tiên bạn cần chạy lệnh sau để cài đặt các routes và views cần thiết:

Bây giờ bạn có thể chạy thử ứng dụng bằng lệnh:

Và thử truy cập vào //localhost:8000 rồi Register và Login xem sao.

Bước 2: Tiến hành tích hợp Google2fa vào dự án.

Sau khi đã chuẩn bị xong các phần cơ bản, chúng ta bắt đầu vào phần chính của ứng dụng. Đó là phần cho phép người dùng kích hoạt chế độ 2FA và thực hiện kiểm tra 2FA khi người dùng đăng nhập. Đầu tiên, chúng ta sẽ tạo một controller để thực hiện việc cho phép người dùng đã đăng nhập bật chế độ 2FA:

Sau đó, ta cài Google Authenticator package:

Sau khi cài đặt hoàn tất, chúng ta mở file app/Http/Controllers/TwoFaceAuthsController.php và bắt đầu viết code nghiệp vụ. Phần này sẽ hiển thị mã vạch được tạo từ mã bí mật (secret code) cùng với một ô nhập dữ liệu cho người dùng. Sau khi họ sử dụng ứng dụng Google Authenticator để quét mã vạch và nhập mã được sinh ra, chúng ta sẽ kiểm tra tính hợp lệ của mã đó và lưu mã bí mật vào cơ sở dữ liệu để sử dụng cho các lần đăng nhập sau. Quy trình làm việc như sau:

  1. Hiển thị mã vạch được tạo từ mã bí mật kèm theo một input nhập dữ liệu.
  2. Người dùng sử dụng ứng dụng Google Authenticator để quét mã vạch và nhập mã được tạo ra.
  3. Kiểm tra tính hợp lệ của mã người dùng nhập vào. Nếu hợp lệ, cập nhật mã bí mật vào cơ sở dữ liệu để sử dụng cho các lần đăng nhập sau.
  4. Nếu mã người dùng nhập không hợp lệ (tức là họ không sử dụng ứng dụng Google Authenticator), thông báo lỗi và chuyển hướng về trang chủ.

Đầu tiên, chúng ta sẽ tạo mã bí mật và mã QR để người dùng có thể quét được.

Tạo view như sau, hình ảnh qr được lấy từ back-end ra qua biến $qrCodeURrl.

Khi đã hoàn tất phần hiển thị mã QR để người dùng quét, chúng ta tiếp tục sang phần xử lý logic khi người dùng nhập mã được sinh ra bởi ứng dụng Google Authenticator. Quy trình đơn giản như sau: Chúng ta sẽ kiểm tra xem mã người dùng nhập vào có khớp với mã sinh ra từ mã bí mật không. Nếu khớp, chúng ta sẽ lưu lại mã bí mật. Trái lại, chúng ta sẽ hiển thị một thông báo lỗi cho người dùng:

Sau khi hoàn thành phần logic cho việc kích hoạt 2FA, chúng ta tiếp tục xử lý phần đăng nhập. Quy trình như sau: nếu người dùng nhập đúng email và mật khẩu, chúng ta sẽ kiểm tra xem người dùng đó đã có mã bí mật chưa. Nếu có, chúng ta sẽ hiển thị màn hình nhập mã được sinh ra bởi ứng dụng Google Authenticator.

Đầu tiên, chúng ta tạo một middleware để thực hiện kiểm tra:

Và gõ code:

Sau đó các bạn nhớ thêm middleware vừa tạo vào app/Http/Kernel.php

Tiếp theo, tạo controller thực hiện kiểm tra authentication code:

Tiếp theo, chúng ta sẽ chỉnh sửa file routes tại routes/web.php. Chúng ta sẽ nhóm các routes sử dụng middleware auth vào một nhóm duy nhất và thêm middleware 2fa để thực hiện kiểm tra 2FA.

Vậy là đã hoàn tất việc tích hợp Google 2fa vào dự án Laravel. Bạn hãy bật 2FA lên rồi test thử xem sao nhé.

Link hướng dẫn cách dùng app Google authenticator để get mã 2fa:

Giảng viên Trần Nguyễn Khánh Lâm
Bộ môn Công nghệ thông tin
FPT Mạng cá cược bóng đá Hải Phòng

Cùng chuyên mục

Đăng Kí học Fpoly 2024