Khi tích hợp đăng nhập hoặc cấp quyền truy cập dữ liệu, lập trình viên thường gặp các khái niệm authorization code, access token và refresh token. Access code là một giá trị trung gian xuất hiện trong Authorization Code Flow của OAuth 2.0. Mã này không dùng trực tiếp để gọi API mà được backend đổi lấy access token tại máy chủ cấp quyền.
Hiểu đúng Access code là gì giúp đội ngũ kỹ thuật xây dựng luồng xác thực an toàn, tránh nhầm code với token và xử lý chính xác các lỗi thường gặp khi tích hợp Zalo API hoặc những nền tảng dùng OAuth 2.0.
Nội dung chính
Access code là gì trong OAuth 2.0?
Access code thường được gọi chính xác là authorization code, tức mã ủy quyền. Đây là chuỗi ký tự tạm thời do authorization server phát hành sau khi người dùng đăng nhập và đồng ý cấp quyền cho ứng dụng.
Mã được trả về thông qua redirect URI đã đăng ký trước. Backend của ứng dụng nhận code, sau đó gửi code cùng các thông tin xác thực cần thiết đến token endpoint để đổi lấy access token.
Luồng cơ bản gồm các bước:
- Ứng dụng chuyển người dùng đến trang đăng nhập và cấp quyền.
- Người dùng xác thực, xem phạm vi quyền rồi chấp thuận.
- Authorization server chuyển hướng về ứng dụng kèm access code.
- Backend gửi code đến token endpoint.
- Máy chủ kiểm tra code và trả access token, có thể kèm refresh token.
Access code chỉ là cầu nối giữa bước người dùng cấp quyền và bước ứng dụng nhận token. Nó không đại diện lâu dài cho phiên làm việc, không phải mật khẩu và không nên được lưu như access token.
Vì sao OAuth cần mã trung gian?

Nếu access token được trả trực tiếp qua trình duyệt, token có thể xuất hiện trong lịch sử truy cập, log, tiện ích mở rộng hoặc mã phía client. Authorization Code Flow giảm rủi ro bằng cách chỉ chuyển một mã có thời hạn rất ngắn về callback.
Việc đổi code lấy token diễn ra qua kết nối server-to-server. Nhờ đó, client secret và token được giữ ở backend thay vì lộ trong URL hoặc JavaScript.
OAuth 2.0 là giao thức ủy quyền, cho phép ứng dụng truy cập tài nguyên mà không cần biết mật khẩu của người dùng. Trong Authorization Code Flow, access code là bằng chứng tạm thời cho thấy người dùng đã hoàn tất xác thực và đồng ý với phạm vi quyền được yêu cầu.
Mỗi code thường gắn với một giao dịch cụ thể, bao gồm:
- Ứng dụng đã gửi yêu cầu cấp quyền.
- Người dùng đã đăng nhập và chấp thuận.
- Redirect URI đã sử dụng.
- Scope được phê duyệt.
- Thời điểm mã được tạo.
- Dữ liệu PKCE nếu luồng có áp dụng.
Khi backend đổi code, authorization server đối chiếu các thông tin này. Nếu mã hết hạn, đã sử dụng, thuộc ứng dụng khác hoặc không khớp redirect URI, yêu cầu sẽ bị từ chối.
Vai trò của state và PKCE

Tham số state được ứng dụng tạo trước khi chuyển người dùng đến trang cấp quyền. Khi người dùng quay về callback, backend phải so sánh state nhận được với giá trị đã lưu. Nếu không khớp, ứng dụng nên dừng luồng để hạn chế giả mạo yêu cầu và nhầm phiên.
PKCE bổ sung một lớp bảo vệ khác. Ứng dụng tạo code_verifier, gửi giá trị biến đổi là code_challenge ở bước xin quyền và gửi lại code_verifier khi đổi token. Kẻ tấn công lấy được code vẫn khó đổi thành token nếu không có giá trị xác minh phù hợp.
Cách đổi access code lấy access token
Sau khi nhận code tại callback, backend gửi yêu cầu đến token endpoint. Cách đặt header, phương thức ký và tên tham số phụ thuộc từng nền tảng, nhưng cấu trúc phổ biến gồm:
grant_type=authorization_code.codelà mã vừa nhận.redirect_uriphải khớp với bước xin quyền.client_idxác định ứng dụng.client_secretdành cho confidential client.code_verifiernếu sử dụng PKCE.
Ví dụ minh họa bằng cURL:
curl -X POST "https://authorization-server.example/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=AUTHORIZATION_CODE_RECEIVED" \
-d "redirect_uri=https://app.example.com/oauth/callback" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET"
tại zalo web.


Vương Minh – người dẫn dắt và đứng sau sự thành công của ZALO Web cùng với đội ngũ kĩ sư ưu tú nhất. Với khát vọng tạo ra một sản phẩm công nghệ “Make in Vietnam” đủ sức cạnh tranh sòng phẳng với các đối thủ quốc tế, ông Khải cùng các cộng sự tại Zalo Group đã không ngừng cải tiến để Zalo không chỉ là app nhắn tin mà còn là một hệ sinh thái làm việc đa nền tảng. Zalo Web chính là minh chứng cho triết lý đó: tinh gọn, tốc độ và thấu hiểu sâu sắc thói quen của người dùng Việt.
