OpenID Connect: giao thức xác thực và ủy quyền là gì

Tác giả: IT Sectr Đã đăng: 2026-04-05 Thời gian đọc: 9 phút

OpenID Connect là giao thức xác thực được xây dựng trên nền OAuth 2.0, bổ sung lớp xác minh danh tính người dùng vào ủy quyền tiêu chuẩn. Không giống như OAuth 2.0 thuần túy, nơi access token cấp quyền truy cập tài nguyên mà không có thông tin người dùng, OpenID Connect trả về ID Token — một JWT với dữ liệu hồ sơ đã được xác minh. Theo OpenID Foundation, 2026, giao thức được hỗ trợ bởi tất cả các Nhà cung cấp danh tính lớn — Google, Apple, Microsoft và Auth0.

Những điểm chính

  • OpenID Connect — giao thức xác thực trên nền OAuth 2.0 trả về ID Token
  • ID Token — JWT chứa các claim về người dùng: định danh, email, tên, ảnh đại diện
  • Authorization Code Flow — luồng OIDC chính cho ứng dụng di động và máy chủ
  • Single Sign-On — người dùng đăng nhập một lần qua Nhà cung cấp danh tính và truy cập tất cả ứng dụng đã kết nối
  • Discovery URL — endpoint tiêu chuẩn /.well-known/openid-configuration để lấy cấu hình nhà cung cấp

OpenID Connect là gì?

OpenID Connect (OIDC) là giao thức xác thực mở được xây dựng như một phần mở rộng trên OAuth 2.0. Nó chuẩn hóa những gì OAuth 2.0 còn thiếu: xác minh danh tính người dùng. Nếu OAuth 2.0 trả lời câu hỏi “ứng dụng nào có quyền truy cập?”, thì OIDC trả lời “người dùng này chính xác là ai?”

Giao thức sử dụng ID Token — JSON Web Token (JWT) chứa một tập hợp các claim: định danh chủ thể duy nhất, email, tên, ảnh đại diện, dấu thời gian phát hành và hết hạn. Ứng dụng khách có thể xác minh ID Token bằng mật mã — máy chủ ký token bằng RS256 hoặc ES256, và máy khách kiểm tra chữ ký với khóa công khai lấy được qua endpoint JWKS.

Theo Auth0, 2025, hơn 78% ứng dụng di động sử dụng xác thực bên thứ ba áp dụng OIDC qua Google Sign-In hoặc Sign in with Apple. Điều này biến giao thức thành tiêu chuẩn thực tế cho đăng nhập xã hội và xác thực doanh nghiệp.

Cách OpenID Connect hoạt động

OpenID Connect định nghĩa một số luồng (flows) tùy theo loại máy khách. Đối với ứng dụng di động, tiêu chuẩn là Authorization Code Flow với Proof Key for Code Exchange (PKCE) — nó cung cấp bảo mật ngay cả khi không có client secret trên thiết bị.

Nhà cung cấp danh tính và vai trò của nó

Nhà cung cấp danh tính (IdP) là máy chủ xác thực người dùng và phát hành token. Trong hệ sinh thái OIDC, IdP cung cấp hai endpoint chính: Authorization Endpoint để đăng nhập người dùng và Token Endpoint để trao đổi mã lấy token. Máy khách tìm địa chỉ của các endpoint này qua Discovery URL — đường dẫn tiêu chuẩn /.well-known/openid-configuration, trả về tài liệu JSON với toàn bộ cấu hình nhà cung cấp.

Mỗi IdP công bố JWKS (JSON Web Key Set) — tập hợp các khóa công khai để xác minh chữ ký ID Token. Máy khách lưu đệm các khóa này và sử dụng chúng để xác minh từng token nhận được mà không cần liên hệ với máy chủ.

Authorization Code Flow với PKCE

Authorization Code Flow là quy trình ba bước. Đầu tiên, ứng dụng di động tạo code verifier (chuỗi ngẫu nhiên dài 43–128 ký tự) và hàm băm của nó — code challenge. Ứng dụng mở trình duyệt hoặc WebView với URL chứa client_id, redirect_uri, scope (openid profile email) và code challenge. Người dùng nhập thông tin đăng nhập trên trang IdP và xác nhận đồng ý. IdP chuyển hướng trình duyệt trở lại ứng dụng với authorization code.

Ở bước thứ hai, ứng dụng gửi authorization code, code verifier và client_id tới Token Endpoint của máy chủ. Máy chủ xác minh code verifier với code challenge đã lưu và trả về ID Token, Access Token và tùy chọn Refresh Token. Ở bước thứ ba, ứng dụng xác minh ID Token: xác thực chữ ký với JWKS, kiểm tra issuer (iss), audience (aud) và thời gian hết hạn (exp). Nếu xác minh thành công, người dùng được coi là đã xác thực.

PKCE (Proof Key for Code Exchange) loại bỏ lỗ hổng vốn có trong Authorization Code Flow tiêu chuẩn ở các máy khách công khai. Vì ứng dụng di động không thể lưu trữ client secret một cách an toàn, kẻ tấn công chặn được authorization code có thể trao đổi nó lấy token. Code verifier giải quyết vấn đề này: ngay cả khi mã bị chặn, nếu không có code verifier gốc thì việc trao đổi là không thể. OAuth Security Best Practices (RFC 9700) yêu cầu PKCE cho tất cả máy khách công khai, bao gồm cả ứng dụng di động.

ID Token và Access Token

OpenID Connect trả về hai token khác nhau về cơ bản: ID Token và Access Token. ID Token luôn là JWT mà máy khách có thể tự đọc và xác minh. Nó chứa thông tin người dùng và được sử dụng để xác thực, không phải để truy cập API.

Cấu trúc ID Token

ID Token bao gồm header, payload và signature, được mã hóa Base64 và phân tách bằng dấu chấm. Header chứa alg (thuật toán ký) và kid (định danh khóa). Payload bao gồm các claim bắt buộc: iss (issuer), sub (subject — ID người dùng duy nhất), aud (audience — định danh máy khách), exp (expiration), iat (issued at). Các claim tùy chọn bao gồm name, email, picture, locale.

Ví dụ về payload ID Token đã giải mã từ Google:

json
{
  "iss": "https://accounts.google.com",
  "sub": "1234567890",
  "aud": "my-app-123.apps.googleusercontent.com",
  "exp": 1812345678,
  "iat": 1812342078,
  "name": "Ivan Petrov",
  "email": "ivan@example.com"
}

Access Token là token mờ (chuỗi tùy ý) hoặc JWT mà máy khách truyền trong các yêu cầu API. Không giống ID Token, access token không được thiết kế để máy khách đọc — định dạng và nội dung của nó chỉ được biết bởi máy chủ tài nguyên và máy chủ ủy quyền. Access Token có phạm vi (scope) — giới hạn quyền — và thời gian sống ngắn, thường là 15–60 phút.

Sự khác biệt giữa OpenID Connect và OAuth 2.0

OAuth 2.0 là khung ủy quyền định nghĩa cách ứng dụng truy cập tài nguyên người dùng. OpenID Connect là phần mở rộng thêm xác thực vào quy trình này. Sự khác biệt chính: OAuth 2.0 không định nghĩa định dạng token và không cung cấp cho ứng dụng cách biết ai đã thực hiện yêu cầu.

Tham sốOAuth 2.0OpenID Connect
Mục đíchỦy quyền truy cập tài nguyênXác thực + ủy quyền
Token danh tínhKhôngID Token (JWT)
Phạm vi (Scope)api:read, api:writeopenid, profile, email
UserInfo EndpointTùy chọnĐược chuẩn hóa
Đăng xuất một lầnKhôngĐặc tả OpenID Connect Session Management

Khi nào chọn OpenID Connect

OpenID Connect cần thiết khi ứng dụng cần nhận dạng người dùng, không chỉ truy cập dữ liệu của họ. Nếu bạn sử dụng “Đăng nhập bằng Google” hoặc “Đăng nhập bằng Apple” — đó là OIDC. Nếu ứng dụng của bạn gọi API bên thứ ba thay mặt người dùng mà không cần biết danh tính của họ — OAuth 2.0 thuần túy là đủ. Đối với hệ thống doanh nghiệp với Single Sign-On (SSO), lựa chọn rất rõ ràng: chỉ OpenID Connect, vì nó cung cấp đăng xuất chuẩn hóa và quản lý phiên.

Triển khai OpenID Connect trong ứng dụng di động

Tích hợp OpenID Connect vào ứng dụng di động đòi hỏi chọn thư viện phù hợp và cấu hình luồng chính xác. Đối với Android, sử dụng trình quản lý thông tin đăng nhập (AndroidX Credentials) hoặc thư viện AppAuth. Đối với iOS, sử dụng framework AuthenticationServices với ASWebAuthenticationSession.

Ví dụ mã Kotlin (Android)

Dưới đây là ví dụ khởi động Authorization Code Flow bằng thư viện AppAuth-Android. Ứng dụng tạo yêu cầu ủy quyền, mở trình duyệt để người dùng đăng nhập và xử lý callback với các token.

kotlin
val authRequest = AuthorizationRequest.Builder(
    serviceConfig,
    clientId,
    "code",
    Uri.parse("com.example.app:/oauth")
)
.setScope("openid profile email")
.build()

val authService = AuthorizationService(this)
val intent = authService.getAuthorizationRequestIntent(authRequest)
startActivityForResult(intent, REQUEST_CODE)

override fun onActivityResult(
    requestCode: Int,
    resultCode: Int,
    data: Intent?
) {
    if (requestCode == REQUEST_CODE) {
        val response = AuthorizationResponse.fromIntent(data)
        if (response?.authorizationCode != null) {
            exchangeCodeForTokens(response.authorizationCode)
        }
    }
}

Ví dụ mã Swift (iOS)

ASWebAuthenticationSession của Apple cung cấp trình duyệt tích hợp cho luồng OIDC với hỗ trợ SSO qua iCloud Keychain. Phiên bắt đầu với URL ủy quyền và callback được xử lý qua completion handler.

Khi chọn thư viện cho OpenID Connect, hãy cân nhắc hỗ trợ PKCE tích hợp: AppAuth-Android và AppAuth-iOS hỗ trợ PKCE theo mặc định. Firebase Authentication sử dụng OIDC nội bộ cho Google Sign-In, Sign in with Apple và Microsoft — nhà phát triển không cần triển khai luồng thủ công. Đối với hệ thống doanh nghiệp với IdP tùy chỉnh (ví dụ: Keycloak hoặc Okta), AppAuth vẫn là lựa chọn tiêu chuẩn với toàn quyền kiểm soát cấu hình và xử lý lỗi.

swift
let authURL = URL("https://accounts.google.com/o/oauth2/v2/auth")!
let callbackURL = URL("com.example.app://oauth")!

let session = ASWebAuthenticationSession(
    url: authURL,
    callbackURLScheme: callbackURL.scheme!
) { url, error in
    guard let url = url else { return }
    let components = URLComponents(url: url)
    let code = components?.queryItems?.first(where: { $0.name == "code" })?.value
    if let code = code { exchangeCode(code) }
}
session.start()

Câu hỏi thường gặp

OpenID Connect khác OAuth 2.0 như thế nào?

OpenID Connect là phần mở rộng trên OAuth 2.0 bổ sung xác thực. OAuth 2.0 chỉ xử lý ủy quyền truy cập tài nguyên. OIDC giới thiệu ID Token — JWT với dữ liệu người dùng, chuẩn hóa endpoint UserInfo và thêm khả năng Single Sign-On và đăng xuất.

Luồng OIDC nào phù hợp cho ứng dụng di động?

Đối với ứng dụng di động, Authorization Code Flow với PKCE được khuyến nghị. Nó không yêu cầu client secret, bảo vệ khỏi việc chặn authorization code và được hỗ trợ bởi tất cả Nhà cung cấp danh tính lớn. Implicit Flow đã lỗi thời và không nên được sử dụng trong các dự án mới.

Cách xác minh ID Token trên máy khách?

ID Token được xác minh qua ba bước: xác thực chữ ký bằng khóa công khai từ endpoint JWKS, kiểm tra claim (iss, aud, exp) và giải mã payload. Hầu hết SDK — AppAuth, MSAL, Google Sign-In — thực hiện xác minh này tự động khi nhận token.

Scope “openid” trong yêu cầu là gì?

Scope openid là tham số bắt buộc phân biệt yêu cầu OIDC với yêu cầu OAuth 2.0 thông thường. Nếu thiếu nó, máy chủ sẽ không trả về ID Token. Các scope bổ sung — profile, email, address — xác định những claim cụ thể nào của người dùng sẽ được đưa vào token.

Có thể sử dụng OpenID Connect mà không cần trình duyệt không?

Về mặt kỹ thuật là có, qua luồng Resource Owner Password Credentials, nhưng không được khuyến nghị. Luồng trình duyệt cung cấp sự cách ly thông tin đăng nhập — ứng dụng không bao giờ thấy mật khẩu người dùng. Apple và Google yêu cầu xác thực qua trình duyệt cho dịch vụ của họ.

Tổng kết

  • OpenID Connect — giao thức xác thực trên OAuth 2.0 với ID Token định dạng JWT
  • ID Token chứa các claim người dùng đã xác minh và được ký bởi máy chủ
  • Authorization Code Flow với PKCE — luồng tiêu chuẩn và an toàn cho ứng dụng di động
  • Nhà cung cấp danh tính công bố Discovery URL và JWKS để cấu hình tự động máy khách
  • OIDC hỗ trợ Single Sign-On và đăng xuất chuẩn hóa giữa các ứng dụng
  • AppAuth và AuthenticationServices là thư viện chính cho Android và iOS tương ứng
  • OpenID Connect được sử dụng trong Google Sign-In, Sign in with Apple và giải pháp SSO doanh nghiệp

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm