Hoàn thành bài "Thiết kế và Sử dụng API như Công cụ cho Agent" trước để mở khoá bài này.Đến bài trước

Tại sao Agents cần xác thực

Khi một tác nhân AI gọi một dịch vụ bên ngoài — một cơ sở dữ liệu, một API bên thứ ba, một hàm đám mây — nó phải chứng minh danh tính mình. Bằng chứng đó có hai hình thức phổ biến: khóa API tĩnh (một chuỗi ngẫu nhiên dài mà dịch vụ cấp cho bạn một lần) hoặc token có thời hạn ngắn được cấp qua OAuth 2.0 (một giao thức nơi tác nhân trao đổi thông tin xác thực lấy một token truy cập có thời hạn). Cả hai đều phục vụ mục đích giống nhau: máy chủ từ xa kiểm tra thông tin xác thực, rồi quyết định có phục vụ yêu cầu hay không.

Nguy cơ không phải ở thông tin xác thực tự nó — mà là những gì xảy ra khi thông tin xác thực bị lộ. Một khóa API bị rò rỉ trong log trò chuyện, một trace lỗi, hoặc một prompt gửi tới LLM có thể bị trích xuất và bị lợi dụng trong vòng vài phút. Đối xử với bí mật như một tài khoản cơ sở dữ liệu sản xuất — đó là kỳ vọng cơ bản.

sơ đồ so sánh 2 luồng xác thực — API key tĩnh gắn liền mỗi request, và OAuth token được cấp qua handshake rồi dùng tạm thời

Where to Store Secrets

Không bao giờ hard-code credentials vào các tệp nguồn. Không dán chúng vào một mẫu prompt. Mẫu chuẩn là tải chúng từ các biến môi trường tại thời điểm chạy, để bí mật sống trong môi trường triển khai, không trong codebase.

python
import os
import requests
api_key = os.environ["WEATHER_API_KEY"]
response = requests.get(
"https://api.weather.example.com/v1/current",
headers={"Authorization": f"Bearer {api_key}"}
)

Trong ví dụ này, khóa được đọc từ môi trường, gắn với dạng Bearer token ở tiêu đề HTTP, và không được ghi ra đĩa hoặc ghi log. Nếu biến môi trường thiếu, tác nhân nên thất bại nhanh với lỗi khởi động rõ ràng — chứ không tự động dùng một placeholder che khuất sai cấu hình.

Đối với phát triển local, một tệp `.env` (tệp văn bản thuần túy chứa các cặp key=value, được loại trừ khỏi kiểm soát phiên bản thông qua `.gitignore`) làm việc rất tốt. Đối với sản phẩm, bộ phối hợp hoặc quản lý bí mật sẽ tiêm các giá trị. Dù sao đi nữa, nguyên tắc vẫn như nhau: bí mật thuộc về bên ngoài mã nguồn.

OAuth Tokens and Refresh Flow

Các khóa tĩnh thì đơn giản nhưng thiếu linh hoạt. Các token OAuth tốt hơn khi tác nhân hành động thay mặt người dùng — ví dụ, đọc lịch của họ hoặc đăng bài lên tài khoản của họ. Quy trình diễn ra như sau:

bash
# Step 1: agent receives an authorization code after user consent
# Step 2: exchange code for access token + refresh token
curl -X POST https://auth.example.com/oauth/token \
-d "grant_type=authorization_code" \
-d "code=AUTH_CODE" \
-d "client_id=AGENT_ID" \
-d "client_secret=AGENT_SECRET"
# Step 3: use the access token until it expires, then refresh

Tác nhân chỉ nên lưu trữ access token ở bộ nhớ và refresh token ở một kho lưu trữ an toàn. Khi access token hết hạn (thường được tín hiệu bởi phản hồi 401), tác nhân âm thầm thay thế bằng một token mới bằng cách dùng refresh token — người dùng sẽ không cấp lại quyền. Việc nhồi toàn bộ logic làm mới vào một hàm tiện ích nhỏ giúp mã gọi ở phía trên sạch.

Tránh rò rỉ trong Prompt và Logs

Lỗ rò rỉ thông tin xác thực phổ biến nhất trong hệ thống tác nhân là echo vô ý: tác nhân sẽ đính kèm bí mật trong prompt gửi tới LLM, hoặc logger in toàn bộ yêu cầu kèm headers. Cả hai đều có thể ngăn chặn dễ dàng khi bạn biết phải kiểm tra.

python
def build_prompt(user_query: str, context: dict) -> str:
# Never inject credentials into the prompt
safe_context = {k: v for k, v in context.items() if not k.startswith("secret_")}
return f"Context: {safe_context}\nUser: {user_query}"
def safe_log_request(method, url, headers):
# Strip Authorization header before logging
redacted = {k: ("***" if k.lower() == "authorization" else v) for k, v in headers.items()}
print(f"{method} {url} headers={redacted}")

Hàm đầu tiên lọc mọi trường context có tên cho biết bí mật. Hàm thứ hai redacts header Authorization trước khi in ra. Áp dụng cách làm scrubbing tương tự cho tracebacks, báo cáo lỗi, và mọi thông báo lỗi dành cho người dùng — nếu một stack trace chứa token, bạn đã mất nó rồi.

Tổng kết

Ba nguyên tắc bao phủ phần lớn diện tích bề mặt. Thứ nhất, nạp credentials từ môi trường, không phải từ mã hoặc prompt. Thứ hai, ưu tiên token ngắn hạn thay vì khóa dài hạn khi dịch vụ hỗ trợ OAuth, và tự động làm mới chúng. Thứ ba, coi mọi dòng log, thông báo lỗi, và prompt như một vector rò rỉ tiềm ẩn — redaction trước khi viết. Tuân thủ ba nguyên tắc này không khiến hệ thống trở nên tuyệt đối an toàn, nhưng đóng các cửa mà kẻ tấn công thực sự có thể đi qua.

Luyện tập sau buổi học

Bài kiểm tra cuối bài

Ôn lại kiến thức, thử sức và nhận góp ý cho bài làm.

0/1
Đã trả lời · 0/1
Authentication, Tokens, and Secure Credential Handling