Trong 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ạnhOAuth 2.0SSO trong EzyLogin
Mục tiêu chínhỦy quyền truy cập tài nguyênXác thực danh tính và đăng nhập một lần
Câu hỏi trả lờiClient được phép truy cập gì?Người dùng đã đăng nhập là ai?
Token chínhAccess token, refresh tokenAccess token, refresh token, ID token
Chuẩn liên quanOAuth 2.0OAuth 2.0 + OpenID Connect
API userTrả về thông tin user theo scopeTrả về UserInfo theo kiểu OIDC
LogoutKhông phải trọng tâm của OAuth 2.0 thuầnCó end-session/logout flow
DiscoveryKhông bắt buộcCó OpenID Connect discovery
Phù hợp khiClient cần gọi API thay mặt userNhiề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_typeLoại token, thường là Bearer
access_tokenToken dùng để gọi API
refresh_tokenToken dùng để xin access token mới
expires_inThời gian sống của access token
scopeCá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_tokenDùng để gọi UserInfo hoặc API
refresh_tokenDùng để làm mới phiên/token
id_tokenJWT chứng minh danh tính người dùng
id_token_expires_inThời gian sống của ID Token
scopeScope đượ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 dungOAuth 2.0 user APISSO UserInfo
Định danh useridsub
Email
Trạng thái xác minh emailKhông phải trọng tâmemail_verified
Tên hiển thị
Ảnh đại diện
UsernameCó thể có theo scopeKhông phải trường chính
PhoneCó thể có theo scopeTùy claim/scope được hỗ trợ

Khi nào dùng OAuth 2.0, khi nào dùng SSO?

Nhu cầuNên dùngVí dụ
Ứng dụng cần gọi API thay mặt người dùngOAuth 2.0Mộ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ậpSSOCô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ínhSSOMộ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 SSOSSOUser 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ứ baOAuth 2.0Mộ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.0Mộ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.0Cơ chế cấp quyền và phát token
SSOCơ chế đăng nhập một lần dựa trên OAuth 2.0/OpenID Connect
Access tokenDùng để truy cập tài nguyên
Refresh tokenDùng để xin token mới
ID TokenDù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.