AAPIUYTIN Đăng nhập Google

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.

Base APIhttps://apiuytin.pages.dev/api/auth
01 / CREDENTIAL

Bộ 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.

TênĐịnh dạngDùng ở đâu
Publish keypk_...OAuth client_id, có thể dùng ở frontend
API keyCHUOTAPI_...Gọi API server-to-server của project
Secret keysk_...OAuth client_secret, chỉ ở backend
Quan trọng: không commit secret key hoặc API key vào Git, không đưa chúng vào JavaScript gửi tới trình duyệt và không dùng credential của project A cho project B.
02 / PROJECT

Tạ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.

dashboard / project fields
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.

03 / OAUTH

Đă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.

01

App → APIUYTIN

Gửi publish key, callback URL và state ngẫu nhiên.

02

APIUYTIN → Google

Nền tảng dùng callback nội bộ cố định và account chooser.

03

Google → APIUYTIN

Google trả code về callback OAuth của nền tảng.

04

APIUYTIN → App

APIUYTIN redirect đúng callback URL của project kèm code.

javascript / browser redirect
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());
Callback sau khi Google xác thực:
https://app.example.com/auth/callback?code=...&state=...
04 / TOKEN

Đổ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.

javascript / node server
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.

05 / USERINFO

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.

http
GET https://apiuytin.pages.dev/api/auth/userinfo
Authorization: Bearer YOUR_ACCESS_TOKEN

200 / userinfo

{
  "sub": "google-subject-id",
  "email": "user@example.com",
  "name": "Tên người dùng"
}
06 / API KEY

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
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.

07 / EXAMPLES

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_...
python / flask callback
@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())
08 / TROUBLESHOOTING

Lỗi thường gặp

Unknown client or redirect_uri is not registered

Publish 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_client

Secret key sai, publish key không thuộc project đó, hoặc token request gửi sai redirect_uri.

invalid_grant

Authorization code đã dùng, đã hết hạn hoặc callback code thuộc project khác.

Google OAuth is not configured

Kiểm tra Google Client ID/Secret trong Cloudflare Pages secrets và hai callback nền tảng trong Google Cloud Console.

09 / SECURITY

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_...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.