OAuth 2.0 là gì? Hướng dẫn chi tiết protocol ủy quyền cho lập trình viên

OAuth 2.0

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ị.

Nguồn tham khảo

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Design Patterns là gì? Hướng dẫn mẫu thiết kế cho lập trình viên

Design Patterns là gì? Design patterns (mẫu thiết kế) là những giải pháp tổng quát, đã được kiểm chứng cho các vấn đề lặp đi lặp lại trong thiết kế…

Xem thêm

CSS Grid cho người mới bắt đầu: Hướng dẫn layout hiện đại

CSS Grid là gì và vì sao quan trọng? CSS Grid Layout là hệ thống bố cục hai chiều, cho phép kiểm soát đồng thời hàng và cột trong CSS….

Xem thêm

Swift Concurrency là gì? Hướng dẫn async/await và Actors cho iOS

Vì sao Swift concurrency là kỹ năng bắt buộc? Swift concurrency là bộ tính năng giúp lập trình viên iOS viết mã bất đồng bộ an toàn và dễ đọc…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất