APIUYTIN / INTEGRATION GUIDE
Tích hợp identity
đúng ngay từ đầu.
APIUYTIN cung cấp Google Account Chooser, OAuth authorization code flow và credential riêng cho từng project. Bạn chỉ cần lưu secret ở backend của mình; URL callback luôn được kiểm tra theo project đã tạo.
https://apiuytin.pages.dev/api/authBộ khóa của từng project
Mỗi lần tạo project, nền tảng sinh một bộ giá trị ngẫu nhiên độc lập. Các giá trị bí mật chỉ trả đầy đủ một lần trong response tạo project; sau đó dashboard chỉ hiển thị dạng masked.
pk_...OAuth client_id, có thể dùng ở frontendCHUOTAPI_...Gọi API server-to-server của projectsk_...OAuth client_secret, chỉ ở backendTạo project và đăng ký callback
Đăng nhập dashboard bằng Google, chọn Tạo project, sau đó nhập một HTTPS callback URL thuộc ứng dụng của bạn. URL được lưu chính xác theo project.
Tên project: Mouse commerce
Direct URL callback: https://app.example.com/auth/callback
// Response tạo project - lưu lại ngay, chỉ trả plaintext một lần
{
"publishKey": "pk_...",
"apiKey": "CHUOTAPI_...",
"secretKey": "sk_...",
"redirectUri": "https://app.example.com/auth/callback"
}Callback của project không phải callback của nền tảng. Google Console chỉ cần whitelist callback nền tảng: https://apiuytin.pages.dev/oauth/google/callback.
Đăng nhập Google Account Chooser
Flow này dành cho người dùng cuối của project. Frontend redirect tới APIUYTIN bằng publishKey và callback URL đã đăng ký. APIUYTIN gọi Google với prompt=select_account, vì vậy bảng chọn tài khoản Google sẽ xuất hiện.
App → APIUYTIN
Gửi publish key, callback URL và state ngẫu nhiên.
APIUYTIN → Google
Nền tảng dùng callback nội bộ cố định và account chooser.
Google → APIUYTIN
Google trả code về callback OAuth của nền tảng.
APIUYTIN → App
APIUYTIN redirect đúng callback URL của project kèm code.
const state = crypto.randomUUID();
const url = new URL("https://apiuytin.pages.dev/oauth/google");
url.searchParams.set("client_id", "pk_YOUR_PUBLISH_KEY");
url.searchParams.set("redirect_uri", "https://app.example.com/auth/callback");
url.searchParams.set("state", state);
window.location.assign(url.toString());https://app.example.com/auth/callback?code=...&state=...Đổi authorization code lấy access token
Thực hiện request này ở server của bạn. Không gọi token endpoint từ browser vì request chứa secret key.
const response = await fetch(
"https://apiuytin.pages.dev/api/auth/oauth/token",
{
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
grant_type: "authorization_code",
code: request.query.code,
client_id: process.env.APIUYTIN_PUBLISH_KEY,
client_secret: process.env.APIUYTIN_SECRET_KEY,
redirect_uri: "https://app.example.com/auth/callback"
})
}
);
const token = await response.json();200 / token response
{
"access_token": "signed_token...",
"token_type": "Bearer",
"expires_in": 3600,
"user": { "id": "...", "email": "...", "name": "..." }
}Authorization code chỉ dùng một lần, hết hạn sau 5 phút và bị ràng buộc với project cùng callback URL.
Lấy thông tin người dùng
Dùng access token trong header Bearer để lấy danh tính đã xác thực.
GET https://apiuytin.pages.dev/api/auth/userinfo
Authorization: Bearer YOUR_ACCESS_TOKEN200 / userinfo
{
"sub": "google-subject-id",
"email": "user@example.com",
"name": "Tên người dùng"
}Gọi API server-to-server
CHUOTAPI_... là API key riêng của project. Chỉ sử dụng nó ở backend khi gọi các API nội bộ hoặc service cần xác thực project.
curl https://apiuytin.pages.dev/api/auth/health \
-H "Authorization: Bearer CHUOTAPI_YOUR_API_KEY"Endpoint discovery: GET /api/auth. Health check: GET /api/auth/health. Session dashboard: GET /api/auth/session.
Các cách tích hợp phổ biến
Express / Node.js
Lưu secret trong process.env, xử lý callback ở route backend, rồi set session cookie của ứng dụng bạn.
APIUYTIN_SECRET_KEY=sk_...Python / Flask
Dùng requests.post ở server để exchange code. Không đặt secret trong template hoặc file JavaScript.
os.environ["APIUYTIN_SECRET_KEY"]PHP
Dùng cURL hoặc HTTP client của framework để gọi token endpoint từ controller callback.
$_ENV["APIUYTIN_SECRET_KEY"]SPA / React / Vue
Chỉ dùng publish key ở browser để bắt đầu redirect. Code phải được đổi token bởi backend hoặc serverless function.
VITE_APIUYTIN_PUBLISH_KEY=pk_...@app.get("/auth/callback")
def callback():
result = requests.post(
"https://apiuytin.pages.dev/api/auth/oauth/token",
json={
"code": request.args["code"],
"client_id": os.environ["APIUYTIN_PUBLISH_KEY"],
"client_secret": os.environ["APIUYTIN_SECRET_KEY"],
"redirect_uri": "https://app.example.com/auth/callback"
}
)
return create_app_session(result.json())Lỗi thường gặp
Unknown client or redirect_uri is not registeredPublish key không tồn tại hoặc callback gửi lên không giống tuyệt đối URL đã lưu, bao gồm scheme, host, path và slash cuối.
invalid_clientSecret key sai, publish key không thuộc project đó, hoặc token request gửi sai redirect_uri.
invalid_grantAuthorization code đã dùng, đã hết hạn hoặc callback code thuộc project khác.
Google OAuth is not configuredKiểm tra Google Client ID/Secret trong Cloudflare Pages secrets và hai callback nền tảng trong Google Cloud Console.
Checklist trước khi go-live
- Dùng HTTPS cho callback URL.
- So sánh
stateđể chống CSRF. - Đổi authorization code ở backend và chỉ dùng một lần.
- Lưu
sk_...vàCHUOTAPI_...trong secret manager. - Không log access token, secret key hoặc authorization code.
- Rotate credential nếu bị lộ và tạo project key mới.
- Chỉ whitelist đúng callback URL cần thiết.