Hãy tưởng tượng bạn đến khách sạn và nhờ nhân viên lễ tân lấy hộ xe từ bãi đỗ. Thay vì đưa chìa khóa chính của xe, bạn đưa cho họ một chìa khóa valet — chỉ dùng được để lấy xe, không mở được cốp hay két sắt. OAuth2 hoạt động theo cách tương tự: cấp cho ứng dụng một "chìa khóa giới hạn" thay vì mật khẩu thật.
OAuth2 là một khung ủy quyền (Authorization Framework) 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 biết mật khẩu.
Bạn bấm "Đăng nhập bằng Google" trên ứng dụng Notion
Notion chuyển hướng bạn sang trang đăng nhập của Google, kèm thông tin: "Tôi là Notion, tôi muốn đọc Calendar của user này"
Google hỏi bạn:"Bạn có đồng ý cho Notion đọc lịch của bạn không?"
Bạn đồng ý → Google tạo một mã tạm thời (authorization_code) và gửi về Notion
Notion dùng mã tạm thời (+ secret key riêng) để đổi lấy Access Token từ Google — bước này xảy ra phía server, người dùng không thấy
Notion dùng Access Token để gọi Google Calendar API và lấy dữ liệu lịch của bạn
sequenceDiagram
participant User as 👤 Người dùng
participant Client as 📱 Ứng dụng (Notion)
participant AuthServer as 🔑 Auth Server (Google)
participant ResourceServer as 🗄️ Resource Server (Google API)
User->>Client: Bấm "Đăng nhập bằng Google"
Client->>AuthServer: Redirect → /authorize?client_id=...&scope=calendar&redirect_uri=...
AuthServer->>User: Hiển thị trang đăng nhập + xin phép
User->>AuthServer: Đăng nhập + Đồng ý cấp quyền
AuthServer->>Client: Redirect về callback?code=AUTH_CODE (mã tạm thời)
Client->>AuthServer: POST /token (code + client_secret) — phía server
AuthServer-->>Client: Access Token + Refresh Token
Client->>ResourceServer: GET /calendar/events (Authorization: Bearer access_token)
ResourceServer-->>Client: 200 OK + Dữ liệu lịch
Client-->>User: Hiển thị lịch