Mục lục

Tương lai 2025: Đăng nhập bằng FaceID/TouchID (Passkeys)

Mật khẩu sắp tuyệt chủng. Tìm hiểu về WebAuthn và Passkeys - công nghệ đăng nhập bằng sinh trắc học được Apple/Google hậu thuẫn.

Hãy tưởng tượng: Bạn vào website, bấm "Login", điện thoại hiện lên "FaceID?", bạn nhìn vào màn hình -> Đăng nhập thành công. Không email. Không password. Không chờ OTP.

Đó là Passkeys.

1. Passkeys hoạt động thế nào? (Asymmetric Cryptography)

Khác với Password (User và Server cùng giữ một bí mật 123456), Passkeys dùng cặp chìa khóa:

  1. Private Key (Chìa khóa riêng): Lưu an toàn trong chip bảo mật của thiết bị (Secure Enclave trên iPhone, TPM trên Windows). Không bao giờ rời khỏi thiết bị.
  2. Public Key (Ổ khóa): Gửi lên Server lưu trữ.

Quy trình đăng nhập:

  1. Server: "Ê iPhone, chứng minh mày là chủ nhân đi. Giải bài toán (Challenge) này nhé".
  2. iPhone: Hiện FaceID để xác nhận chủ nhân đồng ý. Dùng Private Key để giải bài toán (Ký số - Sign). Gửi kết quả lên Server.
  3. Server: Dùng Public Key để kiểm tra chữ ký. Đúng -> Cho vào.

2. Tại sao Passkeys bất tử trước Hacker?

  • Không thể lộ: Private Key nằm trong phần cứng. Dù Hacker hack nát Server của bạn, hắn chỉ lấy được Public Key (cái ổ khóa vô dụng).
  • Chống Phishing tuyệt đối: WebAuthn buộc trình duyệt kiểm tra Domain.
    • Nếu bạn đang ở evil-bank.com, trình duyệt sẽ từ chối dùng Passkey của real-bank.com. Hacker không thể lừa user nhập passkey được.

3. Tích hợp Passkeys vào Next.js

Sử dụng thư viện @simplewebauthn/server@simplewebauthn/browser.

Flow đăng ký (Registration)

  1. Server tạo generateRegistrationOptions.
  2. Client gọi startRegistration. Browser hiện popup "Create a passkey?".
  3. Server verifyRegistrationResponse. Lưu Public Key vào DB.

Flow đăng nhập (Authentication)

  1. Server tạo generateAuthenticationOptions.
  2. Client gọi startAuthentication. Browser hiện popup FaceID.
  3. Server verifyAuthenticationResponse. Tạo Session.

NextAuth (Auth.js) Support

NextAuth v5 đang thử nghiệm Passkeys provider.

ts:
import Passkey from "next-auth/providers/passkey"
 
export const { handlers, auth, signIn, signOut } = NextAuth({
  providers: [Passkey],
  experimental: { enableWebAuthn: true },
})

4. Rào cản hiện tại

  • Device Dependency: Mất điện thoại = Mất Private Key?
    • Giải pháp: Sync qua iCloud Keychain / Google Password Manager. Hoặc giữ lại 1 phương thức backup (Email Magic Link).
  • Browser Support: Cũ quá thì chịu. Nhưng 99% device hiện đại (iPhone, Android, Windows 11) đều đã hỗ trợ.

Kết luận

Passkeys không phải khoa học viễn tưởng. Nó đang ở đây (Google, GitHub, Nintendo đã dùng). Là một Developer tiên phong, hãy bắt đầu tìm hiểu Passkeys ngay hôm nay để không bị bỏ lại phía sau khi kỷ nguyên Password kết thúc.

Quảng cáo
mdhorizontal