OAuth là gì? “Đăng nhập bằng Google” và quyền truy cập được ủy quyền
OAuth là một chuẩn mở cho phép người dùng cấp cho một ứng dụng quyền truy cập hạn chế vào tài khoản của họ trên dịch vụ khác, mà không phải đưa mật khẩu. Khi bạn nhấp “Kết nối Google Calendar” và thấy màn hình hỏi “Cho phép ứng dụng này xem các sự kiện của bạn?”, đó là OAuth. Ứng dụng nhận một token cho đúng những gì bạn đã phê duyệt, và bạn có thể thu hồi bất cứ lúc nào. Cùng cơ chế đó, cộng thêm một lớp gọi là OpenID Connect, tạo nên nút “Đăng nhập bằng Google” và các nút tương tự.
Vì sao OAuth quan trọng khi xây dựng với AI
OAuth xuất hiện trong hai tình huống phổ biến khi bạn xây dựng ứng dụng:
- Đăng nhập bằng mạng xã hội. Bạn muốn người dùng “Đăng nhập bằng Google” (hoặc Apple, Microsoft, GitHub) thay vì tạo thêm một mật khẩu. Xem cách thêm đăng nhập vào ứng dụng.
- Kết nối tới tài khoản của người dùng trên dịch vụ khác. Ứng dụng của bạn cần đọc lịch của người dùng, đăng bài lên tài khoản mạng xã hội của họ, lấy tệp từ ổ đám mây hoặc đồng bộ dữ liệu kế toán của họ.
Trong cả hai trường hợp, công cụ xây dựng AI của bạn có thể viết mã, nhưng một số bước chỉ bạn làm được: tạo một ứng dụng dành cho nhà phát triển với nhà cung cấp, lấy client ID và client secret, đăng ký URL callback và, với một số quyền nhất định, vượt qua bước xem xét của nhà cung cấp. Hiểu cách OAuth hoạt động giúp các bước đó — và các lỗi chúng gây ra — bớt khó hiểu hơn nhiều. Để có bức tranh lớn hơn về đăng nhập, xem xác thực là gì.
Một ví von đời thường
Hãy nghĩ về thẻ từ khách sạn. Khi làm thủ tục nhận phòng, lễ tân xác nhận bạn là ai, rồi đưa bạn một thẻ mở được phòng và phòng gym — không mở được các phòng khác, không mở được khu nhân viên — và thẻ ngừng hoạt động khi trả phòng. Thẻ không chứa hộ chiếu của bạn. Nếu bạn làm mất, lễ tân hủy nó và cấp thẻ mới.
- Lễ tân là máy chủ ủy quyền (trang đăng nhập của Google).
- Kiểm tra danh tính là việc bạn đăng nhập vào Google.
- Thẻ từ là access token.
- “Chỉ phòng và gym” là các scope bạn đã phê duyệt.
- Trả phòng là lúc token hết hạn, hoặc bạn thu hồi quyền truy cập.
Ẩn dụng mà bạn đang dùng không bao giờ thấy mật khẩu Google của bạn, chỉ thấy chiếc thẻ.
OAuth hoạt động từng bước thế nào
Luồng phổ biến nhất cho ứng dụng web là authorization code flow (luồng mã ủy quyền). Đây là những gì xảy ra khi người dùng kết nối Google Calendar với một ứng dụng đặt lịch:
- Nhấp. Người dùng nhấp “Kết nối Google Calendar.”
- Chuyển hướng tới nhà cung cấp. Ứng dụng gửi trình duyệt tới Google cùng client ID của nó, các scope muốn có (đọc sự kiện lịch) và redirect URI nơi Google sẽ đưa người dùng quay về.
- Đăng nhập và đồng ý. Người dùng đăng nhập vào Google (nếu chưa) và thấy màn hình đồng ý liệt kê những gì ứng dụng đang yêu cầu. Họ nhấp Allow.
- Quay về với một mã. Google chuyển hướng trình duyệt về redirect URI của ứng dụng kèm một authorization code ngắn hạn, chỉ dùng một lần.
- Đổi mã trên máy chủ. Máy chủ của ứng dụng gửi mã đó, cùng client secret, trực tiếp tới Google và nhận về một access token (và thường là một refresh token).
- Dùng API. Máy chủ gọi API Google Calendar bằng access token và lấy các sự kiện của người dùng.
Callback ở bước 4 trông giống như sau:
https://yourapp.com/auth/google/callback?code=4/0Adeu5B...&state=x7Kq9
Và phản hồi token ở bước 5 là JSON giống như:
{
"access_token": "ya29.a0Af...",
"expires_in": 3599,
"refresh_token": "1//0gL...",
"scope": "https://www.googleapis.com/auth/calendar.readonly",
"token_type": "Bearer"
}
Điểm thiết kế quan trọng: việc đổi token diễn ra giữa máy chủ với máy chủ, nên client secret và các token không bao giờ cần đi qua trình duyệt.
OAuth so với OpenID Connect so với đăng nhập tự xây
| Trả lời câu hỏi gì | Ví dụ | |
|---|---|---|
| OAuth 2.0 | “Ứng dụng này được phép làm gì thay mặt người dùng?” (ủy quyền) | Đọc lịch của người dùng |
| OpenID Connect (OIDC) | “Người dùng này là ai?” (xác thực), xây dựng trên OAuth | “Đăng nhập bằng Google” trả về một email đã xác minh |
| Đăng nhập riêng của bạn | “Đây có phải mật khẩu đúng của tài khoản này không?” | Email và mật khẩu được lưu (đã băm) trong cơ sở dữ liệu của bạn |
Nhiều ứng dụng kết hợp chúng: đăng nhập bằng email và mật khẩu, cộng “Đăng nhập bằng Google” qua OIDC, cộng các kết nối OAuth riêng tới dịch vụ khác.
Thuật ngữ quan trọng
| Thuật ngữ | Nghĩa |
|---|---|
| Provider / authorization server | Dịch vụ mà người dùng đăng nhập và cấp quyền truy cập — Google, Microsoft, GitHub. |
| Client | Ứng dụng của bạn, như được đăng ký với nhà cung cấp. |
| Client ID | Định danh công khai của ứng dụng bạn với nhà cung cấp. |
| Client secret | Mật khẩu riêng tư của ứng dụng bạn với nhà cung cấp. Chỉ nằm ở máy chủ. |
| Scope | Một quyền cụ thể, như “đọc lịch” hoặc “xem địa chỉ email”. |
| Màn hình đồng ý | Trang nơi người dùng thấy và phê duyệt các scope được yêu cầu. |
| Redirect URI / callback URL | Nơi nhà cung cấp đưa người dùng quay về. Phải được đăng ký trước và khớp chính xác. |
| Access token | Thông tin xác thực ngắn hạn để gọi API. |
| Refresh token | Thông tin xác thực có thời hạn dài hơn để lấy access token mới. Hãy lưu nó như mật khẩu. |
| ID token | Trong OIDC, một token đã ký mô tả người dùng là ai. |
| PKCE | Một bước kiểm tra thêm (“proof key”) ngăn mã bị chặn lại được dùng. Khuyến nghị cho mọi client. |
| state | Một giá trị ngẫu nhiên bảo vệ luồng khỏi các yêu cầu bị giả mạo. |
Những hiểu lầm thường gặp
- “OAuth là một hệ thống đăng nhập.” OAuth thuần chỉ cấp quyền truy cập; OpenID Connect xử lý danh tính. Dùng một access token trần làm bằng chứng về việc ai đó là ai đã gây ra những lỗ hổng bảo mật thực sự.
- “Ứng dụng nhận được mật khẩu của tôi.” Nó không bao giờ làm vậy. Đó chính là điểm mấu chốt.
- “Xin thêm scope thì vô hại.” Người dùng cảnh giác hơn với các yêu cầu rộng, và các nhà cung cấp như Google có thể yêu cầu ứng dụng được xem xét cho các scope nhạy cảm hoặc bị hạn chế. Chỉ xin những gì bạn cần.
- “Client secret có thể đặt ở frontend.” Mọi thứ trong mã trình duyệt đều là công khai. Hãy giữ nó trong bí mật phía máy chủ.
- “Chạy được khi thử nghiệm thì sẽ chạy được khi đưa lên môi trường thật.” Các nhà cung cấp thường giới hạn ứng dụng chưa được xác minh — ví dụ chỉ cho các người dùng thử nghiệm đã liệt kê — và URL chuyển hướng cho tên miền thật của bạn phải được đăng ký riêng.
- “Token tồn tại mãi mãi.” Access token hết hạn nhanh, và người dùng có thể thu hồi quyền truy cập. Ứng dụng của bạn phải xử lý cả hai trường hợp một cách êm ái.
Nên yêu cầu công cụ xây dựng AI của bạn điều gì
- “Thêm ‘Đăng nhập bằng Google’ dùng OpenID Connect với một thư viện xác thực được bảo trì tốt — đừng tự viết luồng OAuth.”
- “Dùng luồng mã ủy quyền với PKCE và kiểm tra tham số
state.” - “Đọc client ID và client secret từ biến môi trường trên máy chủ.”
- “Chỉ yêu cầu các scope chúng ta cần: quyền đọc lịch.”
- “Cho tôi biết mọi URL chuyển hướng cần đăng ký trong bảng điều khiển của nhà cung cấp, cho bản xem trước, URL đã xuất bản và tên miền tùy chỉnh của tôi.”
- “Lưu refresh token đã mã hóa trong cơ sở dữ liệu, và khi token hết hạn hoặc bị thu hồi, yêu cầu người dùng kết nối lại.”
- “Cho người dùng ngắt kết nối tích hợp từ trang cài đặt của họ.”
OAuth và Mythex
Mythex không có đăng nhập tích hợp sẵn cho người dùng cuối của các ứng dụng bạn xây dựng; tài liệu của nó mô tả cách tiếp cận mang-theo-riêng (bring-your-own): bạn chọn một thư viện xác thực hoặc nhà cung cấp được lưu trữ, lưu khóa của nó dưới dạng bí mật của dự án, và agent viết mã. Công thức thêm xác thực có một lời nhắc khởi đầu cho việc này. Bạn cũng sẽ gặp OAuth trong chính Mythex: bạn có thể đăng ký bằng Google, kết nối GitHub để đồng bộ repo dùng GitHub OAuth, và các ứng dụng AI kết nối tới Mythex qua MCP đi qua một trang đồng ý OAuth. Để biết thêm, xem xác thực là gì và xác thực hai yếu tố là gì.
Câu hỏi thường gặp
OAuth nói đơn giản là gì?
OAuth là một chuẩn để người dùng cho phép một ứng dụng truy cập tài khoản của họ trên dịch vụ khác — ví dụ cho phép ứng dụng đặt lịch đọc Google Calendar của họ — mà không đưa mật khẩu cho ứng dụng đó. Người dùng phê duyệt những quyền cụ thể, và ứng dụng nhận một token chỉ dùng được cho các quyền đó.
OAuth có giống “Đăng nhập bằng Google” không?
“Đăng nhập bằng Google” được xây dựng trên OAuth 2.0 cộng với OpenID Connect, một lớp nằm trên OAuth bổ sung cách chuẩn để cho ứng dụng biết người dùng là ai. Bản thân OAuth là về việc cấp quyền truy cập; OpenID Connect là thứ biến nó thành đăng nhập.
Access token OAuth là gì?
Access token là một thông tin xác thực mà ứng dụng gửi đến API của một dịch vụ để chứng minh nó đã được cấp quyền truy cập. Nó thường có thời hạn ngắn và chỉ giới hạn trong các quyền (scope) mà người dùng đã phê duyệt. Refresh token, nếu được cấp, cho phép ứng dụng lấy access token mới mà không cần hỏi lại người dùng.
redirect_uri_mismatch nghĩa là gì?
Nó nghĩa là URL callback mà ứng dụng của bạn gửi khi đăng nhập không khớp chính xác với URL đã đăng ký trong bảng điều khiển của nhà cung cấp. Hãy thêm đúng URL — bao gồm https, tên miền, đường dẫn và dấu gạch chéo cuối nếu có — cho mọi địa chỉ mà ứng dụng của bạn chạy trên đó.
OAuth có an toàn không?
OAuth 2.0 được dùng rộng rãi và an toàn khi được triển khai đúng cách: dùng luồng mã ủy quyền (authorization code) với PKCE, URL chuyển hướng chính xác, tham số state, và giữ client secret cùng token ở phía máy chủ. Hầu hết vấn đề đến từ các lối tắt khi triển khai, đó là lý do nên dùng một thư viện được bảo trì tốt.