OAuth 2.0 và SSO trong EzyLogin khác nhau thế nào?
Back to ezyloginTrong EzyLogin, OAuth 2.0 là nền tảng cấp quyền và phát token. SSO là lớp đăng nhập một lần được xây trên OAuth 2.0/OpenID Connect để giúp nhiều ứng dụng cùng tin cậy một phiên đăng nhập từ EzyLogin.
Nói ngắn gọn:
| Khía cạnh | OAuth 2.0 | SSO trong EzyLogin |
|---|---|---|
| Mục tiêu chính | Ủy quyền truy cập tài nguyên | Xác thực danh tính và đăng nhập một lần |
| Câu hỏi trả lời | Client được phép truy cập gì? | Người dùng đã đăng nhập là ai? |
| Token chính | Access token, refresh token | Access token, refresh token, ID token |
| Chuẩn liên quan | OAuth 2.0 | OAuth 2.0 + OpenID Connect |
| API user | Trả về thông tin user theo scope | Trả về UserInfo theo kiểu OIDC |
| Logout | Không phải trọng tâm của OAuth 2.0 thuần | Có end-session/logout flow |
| Discovery | Không bắt buộc | Có OpenID Connect discovery |
| Phù hợp khi | Client cần gọi API thay mặt user | Nhiều ứng dụng cần dùng chung đăng nhập |
Luồng OAuth 2.0
OAuth 2.0 trong EzyLogin tập trung vào việc client đổi authorization code hoặc refresh token lấy access token.
sequenceDiagram
participant User as Người dùng
participant Client as Ứng dụng client
participant EzyLogin as EzyLogin
participant API as API tài nguyên
User->>Client: Mở ứng dụng
Client->>EzyLogin: Gửi authorization code hoặc refresh token
EzyLogin->>EzyLogin: Kiểm tra client_id, client_secret, redirect_uri
EzyLogin->>EzyLogin: Xác thực code hoặc refresh token
EzyLogin-->>Client: Trả access_token, refresh_token, scope
Client->>API: Gọi API bằng Bearer access_token
API-->>Client: Trả dữ liệu được phép truy cập
Response OAuth 2.0 điển hình:
| Trường | Ý nghĩa |
|---|---|
| token_type | Loại token, thường là Bearer |
| access_token | Token dùng để gọi API |
| refresh_token | Token dùng để xin access token mới |
| expires_in | Thời gian sống của access token |
| scope | Các quyền/phạm vi được cấp |
Luồng SSO
SSO trong EzyLogin dùng OAuth 2.0 Authorization Code Flow, nhưng bổ sung OpenID Connect. Điểm khác biệt quan trọng là client nhận thêm
id_token.
sequenceDiagram
participant User as Người dùng
participant Client as Ứng dụng client
participant EzyLogin as EzyLogin SSO
User->>Client: Chọn đăng nhập bằng EzyLogin
Client->>EzyLogin: Chuyển tới /oauth2/authorize
EzyLogin->>EzyLogin: Kiểm tra phiên đăng nhập user
EzyLogin->>EzyLogin: Kiểm tra client, redirect_uri, scope
alt Cần consent
EzyLogin-->>User: Hiển thị màn hình consent
User->>EzyLogin: Đồng ý
end
EzyLogin-->>Client: Redirect về client kèm authorization code
Client->>EzyLogin: Đổi code tại /oauth2/token
EzyLogin-->>Client: Trả access_token, refresh_token, id_token
Client->>Client: Xác minh ID Token để biết user là ai
Response SSO có thêm các trường liên quan đến định danh:
| Trường | Ý nghĩa |
|---|---|
| access_token | Dùng để gọi UserInfo hoặc API |
| refresh_token | Dùng để làm mới phiên/token |
| id_token | JWT chứng minh danh tính người dùng |
| id_token_expires_in | Thời gian sống của ID Token |
| scope | Scope được cấp, thường có openid, email, profile |
SSO nằm trên OAuth 2.0
Có thể hình dung kiến trúc như sau:
flowchart TD
A[OAuth 2.0 nền tảng] --> B[Authorization Code]
A --> C[Access Token]
A --> D[Refresh Token]
A --> E[Scope]
B --> F[SSO / OpenID Connect]
C --> F
D --> F
E --> F
F --> G[ID Token]
F --> H[UserInfo]
F --> I[JWKS]
F --> J[Discovery]
F --> K[Introspection / Revoke]
F --> L[Logout]
F --> M[PAR]
OAuth 2.0 không biến mất khi dùng SSO. Ngược lại, SSO tận dụng OAuth 2.0 làm nền, rồi thêm lớp định danh.
Khác biệt về dữ liệu user
| Nội dung | OAuth 2.0 user API | SSO UserInfo |
|---|---|---|
| Định danh user | id | sub |
| Có | Có | |
| Trạng thái xác minh email | Không phải trọng tâm | Có email_verified |
| Tên hiển thị | Có | Có |
| Ảnh đại diện | Có | Có |
| Username | Có thể có theo scope | Không phải trường chính |
| Phone | Có thể có theo scope | Tùy claim/scope được hỗ trợ |
Khi nào dùng OAuth 2.0, khi nào dùng SSO?
| Nhu cầu | Nên dùng | Ví dụ |
|---|---|---|
| Ứng dụng cần gọi API thay mặt người dùng | OAuth 2.0 | Một app quản lý công việc cần đọc danh sách project, task hoặc profile của user từ EzyLogin/API trung tâm |
| Nhiều ứng dụng cần dùng chung một hệ thống đăng nhập | SSO | Công ty có các app như Admin Portal, Billing Portal, Support Portal và muốn user đăng nhập một lần qua EzyLogin |
| Client cần ID Token để xác minh danh tính | SSO | Một web app cần nhận id_token, kiểm tra chữ ký JWT qua JWKS, rồi tạo session local cho user |
| Cần logout tập trung khỏi phiên SSO | SSO | User bấm logout ở một portal, EzyLogin đánh dấu phiên/token liên quan đã logout để tránh tiếp tục dùng phiên cũ |
| Cần tích hợp “đăng nhập bằng EzyLogin” cho ứng dụng bên thứ ba | OAuth 2.0 | Một web/app muốn thêm nút “Login with EzyLogin” |
| Chỉ cần cấp quyền truy cập một nhóm tài nguyên cụ thể | OAuth 2.0 | Một service tích hợp chỉ được phép đọc email và profile, không cần quản lý phiên đăng nhập chung |
Nếu bạn vẫn thấy quá mơ hồ về các trường hợp sử dụng, bạn có thể áp dụng quy tắc sau:
- Nếu mục tiêu là cho ứng dụng truy cập API hoặc xác thực người dùng thông qua hệ thống của bạn, dùng OAuth 2.0.Ví dụ: Login with EzyLogin, đọc
project,task,profile. - Nếu mục tiêu là nhiều ứng dụng dùng chung một lần đăng nhập, dùng SSO.Ví dụ: Admin Portal, Billing Portal, Support Portal dùng chung EzyLogin; user chỉ đăng nhập một lần.
Kết luận
Trong EzyLogin:
| Tóm tắt | Ý nghĩa |
|---|---|
| OAuth 2.0 | Cơ chế cấp quyền và phát token |
| SSO | Cơ chế đăng nhập một lần dựa trên OAuth 2.0/OpenID Connect |
| Access token | Dùng để truy cập tài nguyên |
| Refresh token | Dùng để xin token mới |
| ID Token | Dùng để xác minh danh tính người dùng |
OAuth 2.0 trả lời: client được phép truy cập gì?
SSO trả lời: người dùng đã đăng nhập là ai?
EzyLogin dùng OAuth 2.0 làm nền, sau đó bổ sung OpenID Connect để tạo thành luồng SSO hoàn chỉnh cho các ứng dụng client.