TrueSift Next.js SDK
Само за React / Next.js App Router. За Svelte 5 / SvelteKit вижте документацията на Svelte SDK.
Официалният пакет @truesift/next предоставя клиентски компонент за проверка, локални Next.js App Router обработчици и сървърна проверка на proof преди изпълнение на защитено действие. Текуща версия: 0.4.0.
Инсталация
pnpm add @truesift/nextАрхитектура на проверката
- Браузър:
TrueSiftCheckизпраща заявки само към локални challenge/verify API маршрути и получава краткоживеещ непрозраченverificationToken. - Next.js сървър: локалните маршрути комуникират с TrueSift API; ключовете и външните заявки остават скрити за браузъра.
- Защитен бизнес маршрут: сам определя очакваните action, path и origin и консумира еднократния proof преди изпълнение на действието.
Интеграция с Next.js App Router
Променливи на средата само за сървъра
TRUESIFT_API_BASE_URL=https://api.truesift.de
TRUESIFT_SITE_KEY=your_site_key
TRUESIFT_SECRET_KEY=your_secret_key
TRUESIFT_DEFAULT_ACTION=website_check
TRUESIFT_FAIL_OPEN=false
TRUESIFT_TIMEOUT_MS=2500TRUESIFT_API_BASE_URL must be the service origin only, without /api/v1 or endpoint suffixes. Never use NEXT_PUBLIC_ for credentials.
Локални API обработчици
src/app/api/truesift/challenge/route.ts
import { createTrueSiftChallengeHandler } from "@truesift/next/server";
export const dynamic = "force-dynamic";
export const runtime = "nodejs";
export const POST = createTrueSiftChallengeHandler({
apiBaseUrl: process.env.TRUESIFT_API_BASE_URL,
siteKey: process.env.TRUESIFT_SITE_KEY,
secretKey: process.env.TRUESIFT_SECRET_KEY,
defaultAction: process.env.TRUESIFT_DEFAULT_ACTION,
failOpen: process.env.TRUESIFT_FAIL_OPEN === "true",
timeoutMs: Number(process.env.TRUESIFT_TIMEOUT_MS ?? 2500)
});src/app/api/truesift/verify/route.ts
import { createTrueSiftVerifyHandler } from "@truesift/next/server";
export const dynamic = "force-dynamic";
export const runtime = "nodejs";
export const POST = createTrueSiftVerifyHandler({
apiBaseUrl: process.env.TRUESIFT_API_BASE_URL,
siteKey: process.env.TRUESIFT_SITE_KEY,
secretKey: process.env.TRUESIFT_SECRET_KEY,
defaultAction: process.env.TRUESIFT_DEFAULT_ACTION,
failOpen: process.env.TRUESIFT_FAIL_OPEN === "true",
timeoutMs: Number(process.env.TRUESIFT_TIMEOUT_MS ?? 2500)
});The browser calls /api/truesift/challenge and /api/truesift/verify. These local routes forward to the upstream challenge/verify endpoints; never expose the proof-verification endpoint as a public browser proxy.
Клиентски компонент
"use client";
import { useState } from "react";
import { TrueSiftCheck } from "@truesift/next/client";
export function SecurityCheck() {
const [verificationToken, setVerificationToken] = useState<string | null>(null);
return (
<TrueSiftCheck
action="contact_form"
path="/contact"
challengeUrl="/api/truesift/challenge"
verifyUrl="/api/truesift/verify"
onVerified={(result) => setVerificationToken(result.verificationToken ?? null)}
onError={() => setVerificationToken(null)}
/>
);
}Send verificationToken with the protected form submission. The action and path here are illustrative; replace them with the real protected action and route. Do not trust the UI state as authorization.
Защитен бизнес маршрут
import { verifyTrueSiftProof } from "@truesift/next/server";
export async function POST(request: Request): Promise<Response> {
const body: unknown = await request.json();
const verificationToken =
typeof body === "object" && body !== null &&
"verificationToken" in body &&
typeof body.verificationToken === "string"
? body.verificationToken
: "";
const proof = await verifyTrueSiftProof({
verificationToken,
expectedAction: "contact_form",
expectedPath: "/contact",
expectedOrigin: "https://example.com"
});
if (!proof.allowed) {
return Response.json(
{ error: "TRUESIFT_PROOF_REJECTED", reason: proof.reason },
{ status: proof.reason === "unavailable" ? 503 : 403 }
);
}
// Execute the protected operation only after the server-side decision.
return Response.json({ success: true });
}The expected context must be defined by the business route, never copied from the browser. Replace example values with the actual action, route, and origin. On service unavailability, a trusted server-side fail-open policy may return allowed: true with ok: false; handle that explicitly according to your risk policy.
Behavioral Signals v2 (0.4.0)
Опционалният браузърен колектор отчита само агрегирани движения и натискания на показалеца, скролиране, докосвания, клавиатурни събития, focus/blur, промени във видимостта, взаимодействия с проверката и времеви показатели. Прозорецът за наблюдение е 2500 ms и може да се прекъсва. Броячите се нулират при всяка проверка, а обработчиците на събития се освобождават при прекъсване, повторен опит и демонтиране. Не се събират натиснати клавиши, координати, съдържание на форми, DOM идентичности, fingerprint или постоянни идентификатори. Липсващите сигнали сами по себе си не доказват бот. Старият протокол остава съвместим.
Граница на доверие и решения
Клиентски полета като allowed, decision, score, failOpen, action, path и origin не дават право за изпълнение. Единственото приемано клиентско доказателство е непрозрачният verificationToken. Само сървърно потвърден allow може да разреши действието. review, block, липсващи, невалидни, изтекли, повторно използвани или несъвпадащи proof токени се отхвърлят. Fail-open е единствено сървърна политика и следва да е изключена за високорискови действия.
Грешки и достъпност
Невалидни ключове (401), забранен/неактивен сайт (403) и неправилна сървърна конфигурация са отделни грешки, а не недостъпност. Мрежови проблеми, timeout и временни грешки на външната услуга връщат unavailable. failOpen: true не означава успешно валидиран proof (ok остава false).
Визуализация и преводи
Компонентът поддържа режими checkbox, banner, inline, badge; размери normal, compact, flexible; теми auto, light, dark; езици auto, en, de, bg. Анимацията има SVG резервен вариант. Свойството lottie управлява визуалното поведение.
Промени по версии
0.4.0 (12.10.2026): добавени Behavioral Signals v2, прекъсваем прозорец за наблюдение, препращане през локалния verify обработчик и допълнителни тестове на жизнения цикъл. 0.3.0 (16.08.2026): Behavioral Signals v1. 0.2.0 (31.07.2026): сървърна функция verifyTrueSiftProof и детерминирана оценка на proof.
Допълнителна информация
Вижте преглед на SDK, интерактивната SDK страница, npm пакета и официалния сайт.