Automation tutorial

[Playwright] Điền authenticator code tự động

Phong Do Phong Do · 15/04/2025 · 8 phút đọc

TOTP (Time-based One-Time Password) là một thuật toán dùng để tạo mã xác thực một lần dựa trên thời gian, thường được sử dụng trong xác thực hai yếu tố (2FA). TOTP hoạt động bằng cách kết hợp một secret cố định với thời gian hiện tại thông qua thuật toán HMAC-SHA1 để tạo mã số ngắn, thay đổi định kỳ (30 giây). Server và client sử dụng cùng secret và thời gian để tạo mã giống nhau, từ đó xác thực người dùng. Cơ chế này đơn giản, an toàn và được sử dụng rộng rãi trong các ứng dụng như Google Authenticator, Microsoft Authenticator, Authy, v.v

Trong bài này, Better Bytes Academy sẽ giải thích bản chất cách hoạt động của TOTP và hướng dẫn bạn cách code automation cho các hệ thống sử dụng TOTP với Playwright.

Let’s goo.

Hiểu về TOTP

Các thành phần chính

TOTP dựa trên ba yếu tố cốt lõi:

  • Shared Secret (Bí mật chung):
    • Đây là một chuỗi ký tự ngẫu nhiên (random seed) được chia sẻ giữa server và client (thường là ứng dụng như Google Authenticator).
    • Secret này được tạo khi người dùng thiết lập 2FA và phải được giữ an toàn.
    • Ví dụ: JBSWY3DPEHPK3PXP.
  • Thời gian hiện tại:
    • TOTP sử dụng thời gian hệ thống (thường theo chuẩn Unix Epoch, tính bằng giây kể từ 01/01/1970).
    • Thời gian được chia thành các khoảng (thường là 30 giây), gọi là time step. Mỗi time step tạo ra một mã TOTP mới.
  • Thuật toán HMAC-SHA1:
    • HMAC (Hash-based Message Authentication Code) kết hợp secret và thời gian để tạo ra một chuỗi băm (hash).
    • Thuật toán SHA1 được sử dụng để đảm bảo tính bảo mật và tính duy nhất của mã.

Quy trình tạo mã TOTP

Quá trình tạo mã TOTP diễn ra như sau:

  1. Tính thời gian hiện tại:
    • Lấy thời gian hiện tại (Unix timestamp) và chia cho độ dài time step (thường là 30 giây) để lấy số nguyên gọi là counter.
    • Công thức: counter = floor(current_time / time_step).
    • Ví dụ: Nếu thời gian hiện tại là 1625097600 giây, với time step 30 giây, thì counter = floor(1625097600 / 30) = 54169920.
  2. Kết hợp secret và counter:
    • Counter được chuyển thành chuỗi byte.
    • Secret cũng được chuyển thành byte (thường dạng Base32).
    • Cả hai được đưa vào thuật toán HMAC-SHA1 để tạo một chuỗi băm.
    • Công thức: hash = HMAC-SHA1(secret, counter).
  3. Rút gọn chuỗi băm:
    • Chuỗi băm (thường dài 20 byte) được cắt ngắn để tạo mã số gồm 6-8 chữ số.
    • Một kỹ thuật gọi là dynamic truncation được sử dụng:
      • Lấy 4 byte cuối của chuỗi băm (vị trí được chọn động dựa trên byte cuối).
      • Chuyển 4 byte này thành số nguyên.
      • Lấy modulo 10^6 (hoặc 10^8 nếu dùng 8 chữ số) để có mã TOTP.
    • Ví dụ: Nếu số nguyên là 123456789, mã TOTP sẽ là 123456 (6 chữ số).
  4. Kết quả:
    • Mã TOTP (ví dụ: 123456) được tạo ra và có hiệu lực trong suốt time step (30 giây).

3. Quy trình xác thực

  • Client: Người dùng nhập mã TOTP từ ứng dụng Authenticator vào hệ thống.
  • Server:
    • Sử dụng cùng secret và thời gian hiện tại để tạo mã TOTP theo cách tương tự.
    • So sánh mã TOTP từ client với mã TOTP tự tạo.
    • Nếu khớp, xác thực thành công.
  • Khoảng dung sai: Để xử lý lệch thời gian nhỏ giữa client và server, server có thể kiểm tra mã TOTP ở các time step gần kề (ví dụ: ±30 giây).

4. Ví dụ minh họa

Giả sử:

  • Secret: JBSWY3DPEHPK3PXP.
  • Thời gian hiện tại: 1625097600 giây.
  • Time step: 30 giây.
  1. Tính counter: 1625097600 / 30 = 54169920.
  2. Tạo hash: HMAC-SHA1("JBSWY3DPEHPK3PXP", 54169920).
  3. Rút gọn hash để được mã TOTP, ví dụ: 987654.
  4. Người dùng nhập 987654 trong vòng 30 giây → Server kiểm tra và xác nhận.

5. Ưu điểm và nhược điểm của OTP

Ưu điểm của TOTP

  • Tính tạm thời: Mã chỉ có hiệu lực trong 30 giây, giảm nguy cơ bị tái sử dụng.
  • Không cần mạng: Ứng dụng Authenticator tạo mã offline, chỉ cần đồng bộ thời gian.
  • Bảo mật cao: Thuật toán HMAC-SHA1 và secret đảm bảo mã khó bị đoán.

Hạn chế và lưu ý

  • Đồng bộ thời gian: Nếu client và server lệch thời gian quá nhiều, mã TOTP sẽ không khớp. Cần dùng NTP (Network Time Protocol) để đồng bộ.
  • Bảo vệ secret: Nếu secret bị lộ, kẻ tấn công có thể tạo mã TOTP hợp lệ.
  • Tấn công phishing: Mã TOTP có thể bị đánh cắp nếu người dùng nhập vào trang giả mạo trong thời gian mã còn hiệu lực.

Automation TOTP sử dụng Playwright

Code

Để automation, chúng ta cần sử dụng thư viện otplib kết hợp với secret “xin” từ team dev để generate ra TOTP code.

Bước 1: Cài đặt thư viện otplib

npm i otplib

Bước 2: Sử dụng thư viện otplib kết hợp với secret để sinh ra code

import { authenticator } from 'otplib'
...
const secret = 'scret here'; // Thay bằng seed thực tế
const code = authenticator.generate(secret);

Code hoàn chỉnh

import { test } from '@playwright/test';
import { authenticator } from 'otplib'

test('Verify OTP', async ({ page }) => {
  await page.goto('https://material.playwrightvn.com/028-totp.html');

  const secret = 'secret here'; // Thay bằng seed thực tế

  // Tạo mã TOTP
  const code = authenticator.generate(secret);
  console.log('Mã TOTP:', code);

  // Better Bytes Academy - Học Kĩ, Hiểu Bản Chất - Mentor Tận Tình
  await page.fill('//input[@id="totp"]', totpCode);
  await page.click('//button[@type="submit"]');
});

Site thực hành

Học là phải đi đôi với hành!!!

Better Bytes Academy đã tạo một trang thực hành TOTP cho anh em thử nghiệm luôn luôn: https://material.playwrightvn.com/028-totp.html.

Đừng quên ghi tên mình vào, để xuất hiện trên bảng xếp hạng nhé 😉

Quảng cáo

Hiện tại, Better Bytes Academy đang tuyển sinh cho khoá học “Full-stack automation QA từ chưa biết gì với Playwright Typescript”. Khoá học phù hợp với các bạn:

  • Chưa biết gì về lập trình, muốn học automation một cách hệ thống, bài bản.
  • Đã biết làm automation, nhưng kiến thức còn lộn xộn, chưa có tư duy hệ thống.
  • Muốn làm trên hệ thống thực tế, build automation test framework với Playwright từ đầu

Nếu bạn có nhu cầu, hãy đăng kí với admin Nga Quỳnh/ Do Minh Phong để được tư vấn nhaaa.

Post tuyển sinh thì ở đây lun: https://www.facebook.com/share/p/1LMSfGQMDN/

Lời kết

Cảm ơn bạn, vì đã đọc bài. Nếu bạn thấy bài viết hay và hữu ích, hãy cho chúng mình xin 1 like, để chúng mình có thêm động lực ra thật nhiều bài viết hay cho cộng đồng.

Chúc bạn một ngày mới làm việc vui vẻ và hiệu quả. ^^

Phong Do
Tác giả
Phong Do