Ý tưởng cốt lõi: trình duyệt chỉ cầm một mã tạm (authorization code), còn access token được đổi ở kênh sau lưng (back-channel) nên không lộ ra thanh địa chỉ.
Các bước:
1. App chuyển hướng user tới authorization endpoint của provider, kèm client_id, redirect_uri, scope, state, response_type=code.
2. User đăng nhập và đồng ý cấp quyền tại trang của provider — mật khẩu không bao giờ đi qua app của bạn.
3. Provider chuyển hướng ngược về redirect_uri kèm ?code=...&state=....
4. Server của app gọi token endpoint (POST, server-to-server) đổi code lấy access_token (+ refresh_token).
5. App dùng access token gọi resource server; code chỉ dùng được một lần và sống rất ngắn.
GET /authorize?response_type=code&client_id=abc
&redirect_uri=https://app.example.com/callback
&scope=openid%20email&state=xyz123Hai điểm hay bị hỏi thêm: redirect_uri phải khớp tuyệt đối với giá trị đã đăng ký (chống chuyển hướng code sang site của kẻ tấn công), và state phải được sinh ngẫu nhiên rồi đối chiếu khi callback.