

OAuth 2.0 là gì?
OAuth 2.0 là protocol chuẩn ngành cho delegated authorization — cơ chế cho phép ứng dụng bên thứ ba truy cập tài nguyên của người dùng mà không cần lộ thông tin đăng nhập. Được định nghĩa trong RFC 6749, OAuth 2.0 trở thành nền tảng bảo mật cho mọi hệ thống hiện đại: “Đăng nhập bằng Google”, “Connect with GitHub”, API token cho ứng dụng di động.
Khác với xác thực (authentication) — xác định “bạn là ai”, OAuth 2.0 xử lý ủy quyền (authorization) — quyết định “bạn được phép làm gì”. Hai khái niệm bổ sung, không thay thế nhau.
Cách hoạt động cơ bản
Hệ thống OAuth 2.0 gồm ba vai trò chính:
- Resource Owner: Người dùng sở hữu dữ liệu (bạn)
- Client: Ứng dụng muốn truy cập dữ liệu (app third-party)
- Authorization Server + Resource Server: Server cấp và kiểm tra access token
Luồng cơ bản: Client gửi yêu cầu ủy quyền → Resource Owner đồng ý tại Authorization Server → Nhận authorization code → Client đổi code lấy access token → Dùng token gọi API.
Các Authorization Flow phổ biến
1. Authorization Code Flow
Flow chuẩn nhất cho ứng dụng web có backend. User ủy quyền tại auth server → nhận authorization code trên redirect URL → client dùng code đổi lấy access token phía server. Token không bao giờ lộ qua browser — an toàn tuyệt đối.
GET /authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=https://yourapp.com/callback&
scope=read write&
state=random_csrf_token
Sau khi user đồng ý, auth server redirect về callback kèm ?code=AUTH_CODE. Backend đổi code lấy token:
POST /token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=AUTH_CODE&
redirect_uri=https://yourapp.com/callback&
client_id=YOUR_CLIENT_ID&
client_secret=YOUR_SECRET
2. PKCE (Proof Key for Code Exchange)
Extension của Authorization Code, khuyến nghị cho mọi loại client kể cả web app. Client tạo code_verifier (chuỗi ngẫu nhiên), gửi code_challenge (hash SHA-256) khi bắt đầu flow, gửi lại code_verifier khi đổi token. Chống CSRF và authorization code injection.
PKCE sinh ra cho mobile app / native app — nơi client không thể giữ client_secret an toàn. Nhưng RFC 7636 khuyến nghị dùng PKCE cho tất cả clients vì lợi ích bảo mật vượt trội.
3. Client Credentials Flow
Dùng cho server-to-server, không có user involvement. Client tự lấy token dựa trên client_id và client_secret. Phù hợp cho microservices gọi nhau, CI/CD pipeline, automation scripts.
POST /token
grant_type=client_credentials&
client_id=SERVICE_CLIENT_ID&
client_secret=SERVICE_SECRET&
scope=internal_api
OAuth 2.0 vs API Key vs JWT
| Phương pháp | Đặc điểm | Khi dùng |
|---|---|---|
| API Key | Secret tĩnh, không scope, không hết hạn, không revoke individual token | Server-to-server đơn giản, rate limiting cơ bản |
| JWT | Format token (payload + signature), không phải protocol. Cho phép stateless verification | Access token trong hệ thống OAuth, microservices auth |
| OAuth 2.0 | Protocol ủy quyền đầy đủ: scope + expiry + refresh + revocation | Mọi hệ thống cần delegating access an toàn |
Điểm quan trọng: JWT và OAuth 2.0 bổ sung nhau, không đối thủ. JWT thường được dùng làm format access token trong hệ thống OAuth 2.0.
Vì sao OAuth 2.0 quan trọng cho API Security?
- Không phơi credentials gốc: Thay vì app thứ ba nhập thẳng password, user ủy quyền tại auth server đáng tin — tiêu diệt password anti-pattern
- Scope giới hạn quyền: Token có scope “read-only” không thể ghi dữ liệu — giảm thiểu tác động khi token bị leak
- Expiry + Refresh: Access token hết hạn sau vài phút/giờ, dùng refresh token lấy token mới — không cần exchange lại credentials
- Revocation: Thu hồi token bất cứ lúc nào mà không cần đổi password — tách biệt credential và authorization
- Standardized delegation: OIDC (OpenID Connect) xây trên OAuth 2.0 thêm ID Token cho authentication — “Login with Google” thực chất là OIDC + OAuth 2.0
Ứng dụng thực tế
“Đăng nhập bằng Google/Facebook/GitHub”
Chính xác là OIDC on top of OAuth 2.0. User xác thực tại Google → nhận ID Token (authentication) + Access Token (authorization) → app dùng access token gọi Google API.
Mobile App + API Backend
Authorization Code + PKCE là flow chuẩn cho mobile. RFC 8252 và BCP (Best Current Practice) xác nhận đây là phương pháp an toàn nhất cho native apps.
Microservices Communication
Client Credentials Flow cho service-to-service auth. Mỗi microservice có client_id riêng, lấy token nội bộ, gọi service khác mà không lộ secrets.
CI/CD và Automation
GitHub Actions, Jenkins, GitLab CI đều dùng OAuth 2.0 tokens có scope hạn chế để truy cập repos, deploy, quản lý resources.
OAuth 2.1 — Phiên bản kế tiếp
OAuth 2.1 đang trong quá trình hợp nhất OAuth 2.0 + các extension phổ biến (PKCE, BCP security, Token Revocation). Điểm mới: PKCE bắt buộc cho mọi client, Implicit flow bị loại bỏ, Refresh Token rotation được khuyến nghị.
