---
title: Bắt đầu nhanh
---
# Bắt đầu nhanh
Hướng dẫn này sẽ giúp bạn tích hợp CaptchaLa CAPTCHA trong 5 phút.
::: tip Xem nó hoạt động trong 30 giây
[demo-v1.captcha.la](https://demo-v1.captcha.la) — HTML + PHP thuần, giấy phép MIT, có thể view-source mọi trang.
- [popup.html](https://demo-v1.captcha.la/popup.html) — chế độ popup
- [float.html](https://demo-v1.captcha.la/float.html) — widget nổi
- [bind.html](https://demo-v1.captcha.la/bind.html) — gắn vào nút
- [inline.html](https://demo-v1.captcha.la/inline.html) — nhúng trong dòng
- [server-token.html](https://demo-v1.captcha.la/server-token.html) — token do máy chủ phát hành (chống replay)
:::
## 1. Tạo tài khoản
Đăng ký tài khoản miễn phí trong dashboard
[Đăng ký ngay →](https://dash.captcha.la/register)
## 2. Tạo ứng dụng
Tạo ứng dụng trong dashboard để lấy App Key
## 3. Cài đặt SDK
Chọn cách cài đặt bạn muốn
```html
```
```bash
# or via npm
npm install captchala
```
## 4. Khởi tạo CAPTCHA
Khởi tạo thành phần CAPTCHA trong trang của bạn
```html
```
## 5. Xác minh phía server
Xác minh token trên server của bạn
```bash
POST https://apiv1.captcha.la/v1/validate
X-App-Key: YOUR_APP_KEY
X-App-Secret: YOUR_APP_SECRET
Content-Type: application/json
{ "pass_token": "" }
```
```json
{
"code": 0,
"data": {
"valid": true,
"action": "login",
"challenge_id": "ch_xxx",
"uid": null,
"risk_score": 12
}
}
```
::: warning
Always check `data.valid === true` **and** `data.action` matches the scene you expected.
Pass tokens are single-use; the same `pt_xxx` cannot be validated twice.
:::
## Chế độ Token do server cấp (khuyến nghị cho production) {#server-token}
Đối với các thao tác nhạy cảm (đăng nhập, đăng ký, thanh toán), chúng tôi khuyến nghị luồng token do server cấp: backend của bạn sẽ yêu cầu một server_token có thời gian sống ngắn trước, sau đó trình duyệt dùng token đó để khởi tạo CAPTCHA. Cách này giúp ngăn lạm dụng khi app_key bị lộ.
### Khi nào nên dùng
- Khuyến nghị: đăng ký, đăng nhập, đặt lại mật khẩu, thanh toán, đổi điểm và mọi endpoint có thể bị kẻ tấn công tự động hóa bằng script.
- Tùy chọn: biểu mẫu công khai, ô tìm kiếm và các tương tác giá trị thấp nơi sự tiện lợi quan trọng hơn.
### 1. Backend cấp server_token
Gọi /v1/server/challenge/issue từ chính server của bạn, dùng header X-App-Key và X-App-Secret. Không bao giờ để lộ các header này ra trình duyệt.
```bash
# Server-side only — never call this from a browser
curl -X POST https://apiv1.captcha.la/v1/server/challenge/issue \
-H "X-App-Key: YOUR_APP_KEY" \
-H "X-App-Secret: YOUR_APP_SECRET" \
-d "action=login&ttl=300&max_uses=1&bind_ip=1.2.3.4"
# → { "code": 0, "data": { "server_token": "sct_...", "expires_in": 300 } }
```
### 2. Frontend render CaptchaLa với server_token
Truyền token vào thành phần CaptchaLa. SDK sẽ chuyển tiếp nó đến khởi tạo xác minh khi khởi tạo challenge.
```js
// Browser fetches the token from YOUR backend, not from CaptchaLa directly
const { serverToken } = await fetch('/api/captcha/issue').then(r => r.json());
Captchala.init({
appKey: 'YOUR_APP_KEY',
serverToken, // single-use, short-lived
product: 'popup',
action: 'login',
})
.appendTo('#captcha-container')
.onSuccess(res => submitForm(res.token));
```
### Lưu ý bảo mật
- Không bao giờ đặt app_secret trong mã frontend, ứng dụng mobile hoặc repository công khai. Nó phải luôn nằm ở phía server.
- Bật "Require server-issued challenge token" trong dashboard để từ chối mọi challenge được thử mà không có server_token.
- Hãy giữ ttl ngắn (mặc định 300 giây, tối đa 900 giây) và ưu tiên max_uses=1 để giảm tác động nếu token bị lộ.
## Bước tiếp theo
- [Web SDK](./web-sdk)
- [Tài liệu API](./api-reference)