Auth / Identity — Mental Model
1. OAuth 2.0
OAuth chỉ là một standard/protocol, không phải technology hay framework.
Bản chất implementation vẫn là:
- database
- random token
- conditions
- API endpoints
- expiry / permission checks
Server-to-server
1 | client_id + client_secret |
client_id chỉ cần unique.client_secret là random secret đủ mạnh.
Access token:
- có thể là JWT
- có thể chỉ là random opaque string
- format không phải điểm quan trọng
Điểm quan trọng là:
1 | Authorization Server phát token |
User-delegated flow
Core vẫn giống server-to-server, chỉ thêm bước:
1 | user consent |
Flow:
1 | Client |
authorization_code có thể đơn giản là random string.
Backend Authorization Server lưu:
1 | code |
Code tồn tại chủ yếu để access token không phải đi qua browser redirect.
2. OpenID Connect
OIDC là standard xây trực tiếp trên OAuth 2.0, reuse lại flow và concepts của OAuth.
OAuth chủ yếu nói về:
1 | client được phép làm gì |
OIDC thêm:
1 | user này là ai |
Nó thêm một ID Token, thường là JWT.
Ví dụ:
1 | { |
Client verify:
- signature
- issuer
- audience
- expiration
Sau khi verify được ID Token, application có thể tạo local session riêng.
Mental model:
1 | Identity Provider xác thực user |
OIDC không bắt buộc app phải dùng JWT cho local session; random session ID + database cũng được.
3. Identity database
OIDC dẫn đến bài toán:
1 | Identity lưu tập trung |
Ví dụ:
1 | Google Accounts: |
App có thể tạo local user ngay lần login đầu:
1 | verify ID Token |
Đây là JIT provisioning.
4. SCIM
OIDC không xử lý việc:
1 | user bị create/update/disable/delete |
Standard cho việc này là SCIM 2.0.
Bản chất vẫn chỉ là standardized API:
1 | POST /Users |
Không có technology đặc biệt; giá trị nằm ở việc mọi Identity Provider và SaaS cùng hiểu một contract.
5. AWS Cognito User Pool
Cognito User Pool về bản chất là:
1 | User database |
User login:
1 | email/password |
Backend app không cần call Cognito mỗi request.
Thay vào đó:
1 | request có JWT |
JWKS chỉ là public endpoint chứa public keys để verify JWT signatures.
Trade-off:
1 | local JWT verification |
6. Passkeys / WebAuthn
Passkey cuối cùng vẫn chỉ dựa trên asymmetric cryptography.
Register Passkey
1 | Facebook backend tạo random challenge |
Login
1 | Facebook tạo challenge mới |
challenge chỉ là random bytes để mỗi request authentication khác nhau và chống replay.
Touch ID không được gửi cho Facebook.
Nó chỉ làm:
1 | user consent locally |
Standards
Umbrella:
1 | FIDO2 |
WebAuthn chuẩn hóa website/browser flow.
CTAP chuẩn hóa browser/OS ↔ authenticator.
Backend vẫn tự do chọn Rails/Go/Postgres/Redis…, nhưng phải follow WebAuthn verification rules.
Core conclusion
Hầu hết những thứ nghe rất phức tạp trong auth thực ra vẫn là:
1 | normal programming |
OAuth, OIDC, SCIM, WebAuthn không phải magic hoặc technology mới.
Giá trị lớn nhất của chúng là:
1 | nhiều hệ thống khác nhau |