What is It?
OAuth cho phép ứng dụng bên thứ ba truy cập dữ liệu user (ví dụ danh bạ) và đăng nhập bên thứ ba.
How it Works?
OAuth liên quan đến ba bên chính:
- Client application - Ứng dụng hoặc website yêu cầu truy cập dữ liệu user.
- Resource owner - User sở hữu dữ liệu được truy cập.
- OAuth service provider - Nền tảng giữ dữ liệu user và quản lý truy cập qua API.
Scopes
Ứng dụng khai báo dữ liệu và thao tác qua scope.
Trong OAuth cơ bản, scope tuỳ provider. Ví dụ yêu cầu đọc danh bạ có thể là:
scope=contacts
scope=contacts.read
scope=contact-list-r
scope=https://oauth-authorization-server.com/auth/scopes/user/contacts.readonlyKhi OAuth được dùng cho authentication, scope OpenID Connect (chuẩn hoá) thường được sử dụng.
Flows
- Client app yêu cầu truy cập; 2) user đăng nhập và cấp consent; 3) client nhận token; 4) dùng token gọi API.
Grant Types
Nhiều grant type định nghĩa trình tự và cách client giao tiếp với service (cách gửi token), nên còn gọi là “OAuth flow”.
Chúng ta tập trung vào grant type “authorization code” và “implicit”.
Authorization Code Grant Type
- Client application và OAuth service bắt đầu bằng cách redirect user để cấp permission cho access.
- Nếu user đồng ý, client app nhận “authorization code”.
- Client app trao đổi code này cho “access token” từ OAuth service, cho phép nó access dữ liệu của user.
Từ điểm này trở đi, giao tiếp xảy ra an toàn giữa client app và OAuth server, ẩn khỏi user. Kênh an toàn được set up khi client app đăng ký đầu tiên với OAuth service, nơi nó cũng nhận client_secret để verify chính nó trong các request server-to-server này.

Info
Authorization Code Grant Type còn được gọi là Explicit Flow.
Implicit Grant Type
Implicit đơn giản hơn: client nhận access token trực tiếp sau khi user consent, bỏ qua trao đổi code.
Chỉ dùng browser redirect, không có kênh server-to-server; hợp cho SPA/desktop (không lưu client_secret).

Nếu user cấp consent cho access yêu cầu, OAuth service sẽ redirect browser của user đến redirect_uri được chỉ định trong authorization request. Tuy nhiên, thay vì gửi query parameter chứa authorization code, nó sẽ gửi access token và data token-specific khác như URL fragment.
GET /callback#access_token=z0y9x8w7v6u5&token_type=Bearer&expires_in=5000&scope=openid%20profile&state=ae13d489bd00e3c24 HTTP/1.1
Host: client-app.comVì token nằm trong URL fragment, client phải dùng script để trích và lưu.
OAuth Authentication
OAuth có thể được dùng để xác thực qua bên thứ ba.
Đối với cơ chế OAuth authentication, flow OAuth cơ bản vẫn giống; sự khác biệt chính là cách client application sử dụng data nó nhận.
OAuth authentication thường: 1) user chọn “Log in with social media”; 2) app lấy token và gọi API info; 3) app đăng nhập user bằng token.
Cách Lỗ Hổng Xác Thực OAuth Phát Sinh?
- Đặc tả OAuth tương đối mơ hồ và flexible bằng design
- Thiếu built-in security feature
Cách Nhận Biết OAuth Authentication
Chúng ta có thể nhận biết ứng dụng dùng OAuth nếu nó cho phép đăng nhập bằng tài khoản từ website khác. Nếu dùng external OAuth service, xác định provider qua hostname của authorization server, rồi gửi GET đến các endpoint chuẩn:
/.well-known/oauth-authorization-server
/.well-known/openid-configurationChúng thường trả về file JSON configuration chứa thông tin key, chẳng hạn chi tiết của các tính năng bổ sung có thể được hỗ trợ.
Exploiting OAuth Authentication Vulnerabilities
Extending OAuth with OpenID Connect
Cách Phòng Ngừa Lỗ Hổng Xác Thực OAuth
Cho OAuth Service Providers
- Yêu cầu client app đăng ký whitelist
redirect_urisvà so khớp byte-to-byte (exact match). - Bắt buộc
state, bind với session bằng giá trị khó đoán (ví dụ hash session cookie) để chống CSRF và ngăn dùng code bị đánh cắp. - Trên resource server, verify access token thuộc đúng
client_idvà scope khớp với scope gốc.
Cho OAuth Client Applications
- Trước khi implement, đảm bảo chúng ta hiểu rõ quy trình OAuth và các điểm có thể bị khai thác.
- Luôn sử dụng
stateđể chống CSRF. - Bao gồm parameter
redirect_urikhông chỉ trong request/authorization, mà còn trong request/token. - Đối với client OAuth mobile hoặc desktop, nơi giữ
client_secretprivate khó khăn, sử dụng PKCE (Proof Key for Code Exchange) để bảo vệ chống interception code. - Nếu chúng ta đang sử dụng
id_tokencủa OpenID Connect, validate nó đúng theo đặc tả JSON Web Signature và OpenID. - Cẩn thận với authorization code - chúng có thể bị expose trong header Referer khi load external content (image, script, v.v.), hoặc trong file JavaScript có thể được thực thi từ domain bên ngoài.