blog.dopana

Back

Xác thực (authentication) đã phát triển xa hơn username + password. Bài này khám phá các phương thức hiện đại.

Password — Tại Sao Không Đủ?#

  • 81% data breach dùng password yếu hoặc bị đánh cắp
  • User dùng lại password giữa các site
  • Mỗi site yêu cầu password khác → user quên

SSO — Single Sign-On#

Đăng nhập 1 lần, dùng được nhiều app:

SAML (Security Assertion Markup Language)#

User → App (Service Provider) → Redirect → IdP (Identity Provider)

                                           Login

                                    SAML Response → App → Login thành công
plaintext
<!-- SAML Response (XML) -->
<saml:Assertion>
  <saml:Subject>
    <saml:NameID>user@company.com</saml:NameID>
  </saml:Subject>
  <saml:Attribute Name="email">user@company.com</saml:Attribute>
  <saml:Attribute Name="role">admin</saml:Attribute>
</saml:Assertion>
xml

Dùng trong doanh nghiệp — Okta, Azure AD, Google Workspace.

OAuth2 + OIDC#

OAuth2 cho authorization, OIDC (OpenID Connect) thêm authentication layer:

User → App → Redirect → Authorization Server → Login → ID Token (JWT) → App
plaintext
// Xác thực xong — nhận ID Token
const idToken = jwt.verify(token, jwksUri);
// {
//   "sub": "google-oauth2|123456",
//   "email": "alice@example.com",
//   "name": "Alice",
//   "iss": "https://accounts.google.com"
// }
typescript

LDAP — Centralized Directory#

LDAP (Lightweight Directory Access Protocol) lưu user, group, permission tập trung:

dc=example,dc=com
├── ou=people
│   ├── uid=alice
│   │   ├── cn: Alice
│   │   ├── mail: alice@example.com
│   │   └── memberOf: cn=engineers,ou=groups
│   └── uid=bob
└── ou=groups
    ├── cn=engineers
    └── cn=admins
text

WebAuthn — Passwordless Authentication#

WebAuthn dùng public-key cryptography — không password, không OTP.

Flow#

1. Register: Browser → Tạo keypair → Gửi public key → Server lưu
2. Login:   Server gửi challenge → Browser sign bằng private key → Server verify
text

Register#

Login#

Passkeys — WebAuthn Cho Người Dùng#

Passkeys là WebAuthn + credential sync (iCloud Keychain, Google Password Manager):

User → "Sign in with Face ID / Touch ID"

  Device tạo keypair
  Public key → Server
  Private key → Sync qua iCloud/Google

  Đăng nhập ở thiết bị khác — dùng passkey từ cloud
plaintext

Passkeys đang được Apple, Google, Microsoft đẩy mạnh — thay thế password trong tương lai.

So Sánh#

Phương thứcBảo mậtUXTriển khai
PasswordThấpKémDễ
OAuth2/OIDCCaoTốt (SSO)Trung bình
SAMLCaoTốt (SSO)Phức tạp
LDAPTrung bìnhTrung bìnhTrung bình
WebAuthnRất caoXuất sắcPhức tạp
PasskeysRất caoXuất sắcTrung bình

Multi-Factor Authentication (MFA)#

Kết hợp nhiều yếu tố:

  • Something you know — password
  • Something you have — phone, hardware key (YubiKey)
  • Something you are — fingerprint, face
// TOTP — Time-based One-Time Password
import { authenticator } from 'otplib';

// Tạo secret
const secret = authenticator.generateSecret();
const otpauth = authenticator.keyuri(user.email, 'MyApp', secret);
// User scan QR code với Google Authenticator

// Verify
const isValid = authenticator.check(token, secret);
typescript

Implementation — Auth với NextAuth.js#

Kết Luận#

Password đang chết dần. SSO + MFA là chuẩn hiện tại. WebAuthn/Passkeys là tương lai.

Cho ứng dụng mới: bắt đầu với OAuth2/OIDC (Google, GitHub login) + optional password. Thêm WebAuthn cho nâng cao. Cho enterprise: SAML + LDAP + MFA.

Tài liệu tham khảo#