Mục lục

Hiểu sâu OAuth 2.0: Đừng chỉ copy-paste config Google

Mổ xẻ quy trình 'Login with Google'. Phân biệt OAuth (Quyền hạn) vs OpenID Connect (Danh tính). Tại sao Access Token lại nguy hiểm?

Bạn copy config GoogleProvider vào NextAuth và nó chạy "ngon lành". Nhưng bạn có thực sự hiểu chuyện gì xảy ra không? Nếu bạn cần tích hợp với Zalo, MoMo, hay SSO nội bộ công ty -> Bạn phải hiểu giao thức này.

1. OAuth 2.0 là gì? (Authorization)

OAuth sinh ra để giải quyết bài toán: "Làm sao để app in ảnh (Web A) lấy được ảnh từ Google Photos (Web B) của user mà không cần user đưa password Google cho Web A?". -> OAuth trao cho Web A một cái "chìa khóa phụ" (Access Token) chỉ mở được cửa kho ảnh.

OAuth KHÔNG PHẢI là Authentication. Nó không sinh ra để đăng nhập. Nó sinh ra để cấp quyền.

2. OpenID Connect (OIDC) (Authentication)

Các kỹ sư nhận ra OAuth quá hay, nên họ xây thêm một tầng logic bên trên để dùng làm Đăng nhập -> Đó là OIDC. OIDC thêm một loại token mới: ID Token (Giống như Thẻ căn cước).

  • Access Token: Để gọi API (Lấy danh sách bạn bè, post bài).
  • ID Token: Để biết User là ai (Email, Tên, Avatar).

3. The Flow: Authorization Code Flow

Đây là quy trình chuẩn mực và bảo mật nhất hiện nay.

  1. User bấm Login: App chuyển hướng User sang trang accounts.google.com.
  2. Consent: Google hỏi "Cho phép App X xem email không?".
  3. Callback: User đồng ý -> Google chuyển hướng về App kèm theo một code ngắn hạn.
  4. Exchange: App (Server-side) dùng code + client_secret gửi lại cho Google để đổi lấy Access Token + ID Token.
  5. Done: App đọc ID Token để tạo Session cho user.

Tại sao phải rắc rối vậy? Để Access TokenClient Secret không bao giờ lộ ra ngoài trình duyệt (Front-end). Mọi trao đổi nhạy cảm đều diễn ra giữa Server App <-> Server Google.

4. Sai lầm thường gặp

Lưu Access Token Google vào LocalStorage để gọi API từ Client

Rất nguy hiểm. Nếu App bạn bị XSS, hacker lấy được token này -> Nó có thể thay mặt user gửi email, xóa dữ liệu trên Google Drive...

Giải pháp: Chỉ lưu Session ID của App bạn ở Client. Khi cần gọi Google API, Client gọi lên Server App -> Server App dùng Access Token (đang lưu bảo mật trong DB/Redis) để gọi Google.

Kết luận

"Login with Google" không phải là phép thuật. Nó là một chuỗi bắt tay (Handshake) chặt chẽ giữa 3 bên: Client - App Server - Google Server. Hiểu rõ luồng này giúp bạn tự tin debug khi gặp lỗi redirect_uri_mismatch hay invalid_grant.

Quảng cáo
mdhorizontal