← Cloudflare Turnstile / turnstile / get-started / client-side-rendering
Konfigurace widgetů
Vzhled, chování i funkce widgetu Turnstile nastavíte pomocí data atributů nebo parametrů renderování v JavaScriptu.
Způsoby vykreslení
Widgety Turnstile lze implementovat pomocí implicitního nebo explicitního vykreslování.
Implicitní vykreslování automaticky prohledá vaše HTML a najde prvky s cf-turnstile a při načtení stránky vykreslí widget. Hodí se pro jednoduché implementace, statické weby nebo situace, kdy chcete, aby se widget zobrazil hned po načtení stránky.
Jak to funguje
- Přidejte na stránku skript Turnstile.
- Vložte
<div class="cf-turnstile" data-sitekey="your-key"></div>elementy. - Widgety se vykreslí automaticky při načtení stránky.
- Nastavte widget pomocí
data-*atributy na HTML elementu.
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-theme="light"></div>Explicitní vykreslování vám dává programovou kontrolu nad tím, kdy a jak se widgety vytvářejí pomocí funkcí JavaScriptu. Hodí se pro dynamické weby a jednostránkové aplikace (SPA), když potřebujete řídit načasování vzniku widgetu, vykreslovat widget podmíněně podle akcí návštěvníka nebo použít více widgetů s odlišnou konfigurací.
Jak to funguje
- Přidejte skript Turnstile s
?render=explicit. - Vytvořte kontejnerové prvky (bez
cf-turnstiletřídu). - Zavolejte
turnstile.render()ve chvíli, kdy chcete widgety vytvořit. - Nastavte widget pomocí parametrů v objektu JavaScriptu.
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" defer></script>
<div id="my-widget"></div>
<script>
window.onload = function() {
turnstile.render('#my-widget', {
sitekey: '<YOUR-SITE-KEY>',
theme: 'light',
callback: function(token) {
console.log('Success:', token);
}
});
};
</script>Velikosti widgetu
V režimech Managed a Non-Interactive může mít widget Turnstile dvě různé pevné velikosti nebo pružnou šířku.
| Velikost | Šířka | Výška | Případ použití |
|---|---|---|---|
| Normal | 300px | 65px | Standardní implementace |
| Flexibilní | 100% (min: 300px) | 65px | Responzivní design |
| Compact | 150px | 140px | Rozvržení s omezeným prostorem |
normal: Výchozí velikost vyhovuje většině rozvržení na počítači i mobilu. Použijte ji, pokud máte na webu nebo ve formuláři dostatek místa na šířku.flexible: Automaticky se přizpůsobí šířce kontejneru a zachová minimální použitelnost. Hodí se pro responzivní návrhy, které musí fungovat na všech velikostech obrazovky.compact: Vhodné pro mobilní rozhraní, postranní panely nebo místa s omezenou šířkou. Kompaktní widget je vyšší než běžný, aby vyrovnal menší šířku.
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-size="flexible"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-size="compact"></div> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
size: 'flexible'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
size: 'compact'
});Možnosti motivu
Přizpůsobte vzhled widgetu designu svého webu.
auto(výchozí): Automaticky se přizpůsobí motivu nastavenému v systému návštěvníka. Pro většinu implementací doporučujeme auto, protože respektuje předvolby návštěvníka a nabízí nejlepší přístupnost.light: Světlý motiv se světlými barvami a jasným kontrastem. Nejlépe funguje na světlém pozadí a díky vysokému kontrastu je text dobře čitelný.dark: Tmavý motiv optimalizovaný pro tmavá rozhraní. Hodí se pro tmavá rozhraní, herní weby nebo aplikace s tmavým barevným schématem.
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-theme="light"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-theme="dark"></div> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
theme: 'light'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
theme: 'dark'
});Režimy vzhledu
Pomocí režimu appearance určete, kdy se widget návštěvníkům zobrazí.
always(výchozí): Widget je viditelný od načtení stránky. Pro většinu implementací je to nejlepší volba, protože návštěvník widget uvidí okamžitě a dostane jasnou vizuální informaci, že bezpečnostní ověření běží.execute: Widget se zobrazí až po zahájení výzvy. To se hodí, když potřebujete řídit okamžik jeho zobrazení, například až návštěvník začne vyplňovat formulář nebo stiskne tlačítko pro odeslání.interaction-only: Widget se zobrazí jen tehdy, když je potřeba interakce návštěvníka, což je pro návštěvníky nejméně rušivé. Většina z nich widget nikdy neuvidí, podezřelí boti ale narazí na interaktivní výzvu.
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-appearance="execute"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-appearance="interaction-only"></div> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
appearance: 'execute'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
appearance: 'interaction-only'
});Režimy spouštění
Určete, kdy se výzva spustí a kdy se vygeneruje token.
-
render(výchozí): Ověření proběhne automaticky po zavolánírender()a poskytuje ochranu okamžitě po načtení widgetu. Výzva probíhá na pozadí už během načítání stránky, takže token je připravený ve chvíli, kdy návštěvník odesílá data. -
execute: Výzva se spustí až po zavoláníturnstile.execute()zvlášť a dává vám přesnou kontrolu nad tím, kdy ověření proběhne. Tato možnost se hodí pro vícekrokové formuláře, podmíněné ověřování nebo pro případy, kdy chcete výzvu odložit až na okamžik, kdy se návštěvník skutečně pokusí odeslat data. Ověření pak běží jen tehdy, když je potřeba, což zlepšuje rychlost načtení stránky i komfort návštěvníka.Časté scénáře
- Vícekrokové formuláře: ověření spouštějte až v posledním kroku.
- Podmíněná ochrana: ověřujte pouze návštěvníky, kteří splňují určitá kritéria.
- Optimalizace výkonu: odložte ověření, zkrátíte tím dobu prvního načtení stránky.
- Ověření spuštěné uživatelem: návštěvník zahájí ověření ručně.
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-execution="execute"></div> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
execution: 'execute'
}); turnstile.execute('#widget-container');Nastavení jazyka
Nastavte jazyk rozhraní widgetu.
auto(výchozí): Použije jazyk nastavený v prohlížeči návštěvníka.- Kódy konkrétních jazyků: dvoupísmenné kódy podle ISO 639-1, například
es,fr,de. - Jazyk a region: kombinované kódy pro regionální varianty, například
en-US,es-MX,pt-BR.
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-language="es"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-language="en-US"></div> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
language: 'es'
});Nastavení callbacků
Zpracujte události widgetu pomocí callbacků.
callback: Vyvolá se, když je výzva úspěšně dokončena.error-callback: Vyvolá se, když během výzvy dojde k chybě.expired-callback: Vyvolá se, když vyprší platnost tokenu (před vypršením časového limitu).timeout-callback: Vyvolá se, když u interaktivní výzvy vyprší časový limit.
Callback pro úspěch dostane token, který musíte ověřit na svém serveru přes Siteverify API. Tokeny jsou jednorázové a vyprší po 300 sekundách (pěti minutách).
<div class="cf-turnstile"
data-sitekey="<YOUR-SITE-KEY>"
data-callback="onSuccess"
data-error-callback="onError"
data-expired-callback="onExpired"
data-timeout-callback="onTimeout"></div>
<script>
function onSuccess(token) {
console.log('Challenge Success:', token);
}
function onError(errorCode) {
console.log('Challenge Error:', errorCode);
}
function onExpired() {
console.log('Token expired');
}
function onTimeout() {
console.log('Challenge timed out');
}
</script> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
callback: function(token) {
console.log('Challenge Success:', token);
},
'error-callback': function(errorCode) {
console.log('Challenge Error:', errorCode);
},
'expired-callback': function() {
console.log('Token expired');
},
'timeout-callback': function() {
console.log('Challenge timed out');
}
});Doporučené postupy
- Vždy implementujte success callback, který token zpracuje a umožní odeslání formuláře nebo další krok.
- Používejte error callbacky, aby se chyby ošetřily elegantně a návštěvník dostal zpětnou vazbu.
- Sledujte vypršené tokeny a obnovujte výzvy dříve, než přestanou platit.
- Ošetřete vypršení časového limitu, aby návštěvník věděl, jak výzvu dokončit.
Pokročilé možnosti konfigurace
Chování při opakování
Nastavte, jak má Turnstile řešit neúspěšné ověřovací výzvy.
auto(výchozí): Neúspěšná ověření se automaticky opakují. Automatické opakování je pro návštěvníka příjemnější, protože se samo zotaví z dočasných potíží se sítí i z chyb při zpracování.never: Vypne automatické opakování. Vyžaduje ruční zásah a dává vám plnou kontrolu nad zpracováním chyb v aplikacích, které potřebují vlastní logiku opakování.retry-interval: Řídí prodlevu mezi opakovanými pokusy (výchozí hodnota: 8000ms) a umožňuje vyvážit rychlost obnovy a zátěž serveru.
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-retry="never"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-retry-interval="0000"></div>Chování při obnovování
Nastavte, jak má Turnstile řešit vypršení platnosti tokenu a časové limity interaktivní výzvy.
refresh-expired: Řídí chování při vypršení platnosti tokenů (auto,manual,never).refresh-timeout: Řídí chování při vypršení časového limitu interaktivních výzev (auto,manual,never).
Přínosy
autoprobíhá pro návštěvníka plynule, spotřebuje ale více prostředků.manualdává kontrolu návštěvníkům, ti ale musí sami zasáhnout.nevervyžaduje, aby veškerou logiku obnovení řešila vaše aplikace.
Pro vypršení platnosti tokenu a pro časové limity interaktivní výzvy můžete zvolit různé strategie podle toho, jaké prostředí chcete návštěvníkům nabídnout.
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-refresh-expired="manual"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-refresh-timeout="auto"></div>Vlastní data
Přidejte ke svým výzvám vlastní identifikátory a data.
action: Vlastní identifikátor pro analytiku a rozlišení widgetů (maximálně 32 znaků).cData: Vlastní data, která se vrátí při ověření (maximálně 255 znaků).
Případy použití
- Sledování akcí: v analytice rozlišíte přihlášení, registraci, kontaktní formuláře a další.
- Kontext návštěvníka: předejte ID návštěvníka, informace o relaci nebo další kontextová data.
- A/B testování: sledujte různé konfigurace widgetu nebo varianty stránky.
- Detekce podvodů: doplňuje další kontext pro vyhodnocení rizika.
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-action="login"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-cdata="user-cdata"></div>Integrace do formuláře
Nastavte, jak se Turnstile propojí s HTML formuláři.
Když je tato možnost zapnutá, Turnstile automaticky vytvoří skrytý prvek <input> element s ověřovacím tokenem. Odešle se spolu s ostatními daty formuláře, takže validace na serveru je přímočará.
response-field: Určuje, zda se má vytvořit skryté pole formuláře s tokenem (default: true)response-field-name: Vlastní název skrytého pole formuláře (default: cf-turnstile-response)
Přínosy
- Automatická integrace s formulářem znamená, že se token odešle spolu s formulářem a není potřeba žádný další JavaScript.
- Vlastní názvy polí pomáhají předejít konfliktům se stávajícími poli formuláře.
- Vypnutá pole s odpovědí vám dají plnou kontrolu nad prací s tokenem ve složitějších formulářích.
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-response-field-name="turnstile-token"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-response-field="false"></div>Úplný přehled konfigurace
| Parametry vykreslení v JavaScriptu | Datový atribut | Popis |
|---|---|---|
sitekey |
data-sitekey |
Každý widget má sitekey. Ten je svázaný s konfigurací daného widgetu a vzniká při jeho vytvoření. |
action |
data-action |
Zákaznická hodnota, která v analytice slouží k odlišení widgetů pod stejným sitekey a která se vrátí při ověření. Může obsahovat nejvýše 32 alfanumerických znaků včetně _ a -. |
cData |
data-cdata |
Zákaznická data, která lze k výzvě připojit po celou dobu jejího vydání a která se vrátí při ověření. Mohou obsahovat nejvýše 255 alfanumerických znaků včetně _ a -. |
callback |
data-callback |
Zpětné volání JavaScriptu, které se vyvolá po úspěšném vyřešení výzvy. Předá se mu token, který lze ověřit. |
error-callback |
data-error-callback |
Zpětné volání JavaScriptu, které se vyvolá při chybě (například chybě sítě nebo neúspěšné výzvě). Přečtěte si Chyby na straně klienta. |
execution |
data-execution |
Execution určuje, kdy se získá token widgetu, a může být nastavené na render (výchozí) nebo při execute. Viz Režimy spouštění s dalšími informacemi. |
expired-callback |
data-expired-callback |
Zpětné volání JavaScriptu, které se vyvolá po vypršení platnosti tokenu a widget neresetuje. |
before-interactive-callback |
data-before-interactive-callback |
Zpětné volání JavaScriptu, které se vyvolá předtím, než výzva přejde do interaktivního režimu. |
after-interactive-callback |
data-after-interactive-callback |
Zpětné volání JavaScriptu, které se vyvolá, když výzva opustí interaktivní režim. |
unsupported-callback |
data-unsupported-callback |
Zpětné volání JavaScriptu, které se vyvolá, když Turnstile daného klienta nebo prohlížeč nepodporuje. |
theme |
data-theme |
Motiv widgetu. Může nabývat těchto hodnot: light, dark, auto. Výchozí hodnota je auto, které respektuje předvolbu návštěvníka. Odpovídajícím nastavením motivu lze vynutit light nebo dark. |
language |
data-language |
Jazyk, který se má zobrazit. Musí jít o jednu z hodnot: auto (výchozí), kdy se použije jazyk zvolený návštěvníkem, nebo dvoupísmenný kód jazyka podle ISO 639-1 (například en) nebo kód jazyka a země (například en-US). Viz seznam podporovaných jazyků s dalšími informacemi. |
tabindex |
data-tabindex |
Hodnota tabindex u iframu Turnstile z důvodu přístupnosti. Výchozí hodnota je 0. |
timeout-callback |
data-timeout-callback |
Zpětné volání JavaScriptu, které se vyvolá, když je zobrazena interaktivní výzva a návštěvník ji ve stanoveném čase nevyřeší. Zpětné volání widget resetuje, aby měl návštěvník možnost výzvu vyřešit znovu. |
response-field |
data-response-field |
Logická hodnota, která určuje, zda se vytvoří vstupní prvek s tokenem odpovědi. Výchozí hodnota je true. |
response-field-name |
data-response-field-name |
Název prvku input, výchozí hodnota je cf-turnstile-response. |
size |
data-size |
Velikost widgetu. Může nabývat těchto hodnot: normal, flexible, compact. |
retry |
data-retry |
Určuje, zda se widget má o získání tokenu automaticky pokusit znovu, pokud napoprvé neuspěl. Výchozí hodnota je auto, což znamená automatické zopakování pokusu. Lze to nastavit na never a opakování při chybě se vypne. |
retry-interval |
data-retry-interval |
Když retry je nastaven na auto, retry-interval určuje dobu mezi opakovanými pokusy v milisekundách. Hodnota musí být kladné celé číslo menší než 900000, výchozí hodnota je 8000. |
refresh-expired |
data-refresh-expired |
Po vypršení platnosti token automaticky obnoví. Může nabývat hodnot auto, manual, případně never, výchozí hodnota je auto. |
refresh-timeout |
data-refresh-timeout |
Určuje, zda se widget má automaticky obnovit, když u interaktivní výzvy vyprší časový limit. Přijímá hodnoty auto (po vypršení interaktivního timeoutu se automaticky obnoví), manual (vyzve návštěvníka k ručnímu obnovení) nebo never (zobrazí se timeout), výchozí hodnota je auto. Platí pouze pro widgety v režimu Managed. |
appearance |
data-appearance |
Parametr appearance určuje, kdy je widget viditelný. Může být always (výchozí), execute, případně interaction-only. Viz Režimy vzhledu s dalšími informacemi. |
feedback-enabled |
data-feedback-enabled |
Umožňuje Cloudflare shromažďovat zpětnou vazbu od návštěvníků při selhání widgetu. Může být true (výchozí) nebo false. |
offlabel-show-privacy |
data-offlabel-show-privacy |
Zobrazí odkaz na zásady ochrany soukromí u widgetů Turnstile bez brandingu. Může být true (výchozí) nebo false. |
offlabel-show-help |
data-offlabel-show-help |
Zobrazí odkaz na nápovědu u widgetů Turnstile bez brandingu. Může být true (výchozí) nebo false. |
Příklady
<div style="max-width: 500px;">
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-size="flexible" data-theme="auto"></div>
</div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-size="compact" data-theme="light" data-language="en">
</div>