← Cloudflare Turnstile / turnstile / get-started / client-side-rendering
Конфигурации виджетов
Настройте внешний вид, поведение и возможности виджета Turnstile через data-атрибуты или параметры рендеринга в JavaScript.
Способы отрисовки
Виджеты Turnstile можно подключать через неявную или явную отрисовку.
При неявной отрисовке Turnstile автоматически ищет в вашем HTML элементы с классом cf-turnstile в качестве класса и отрисовывает виджет при загрузке страницы. Такой способ лучше всего подходит для простых реализаций, статических сайтов и случаев, когда виджет должен появляться сразу при загрузке страницы.
Как это работает
- Добавьте скрипт Turnstile на страницу.
- Подключите
<div class="cf-turnstile" data-sitekey="your-key"></div>(элементы). - Виджеты отрисуются автоматически при загрузке страницы.
- Настройте виджет с помощью
data-*в атрибутах HTML-элемента.
<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>Явный рендеринг даёт программный контроль над тем, когда и как создаются виджеты, с помощью функций JavaScript. Он лучше всего подходит для динамических сайтов и одностраничных приложений (SPA), когда нужно управлять моментом создания виджета, выводить его в зависимости от действий посетителя или размещать несколько виджетов с разными настройками.
Как это работает
- Добавьте скрипт Turnstile с
?render=explicitпараметр. - Создайте элементы контейнера (без
cf-turnstileв качестве класса). - Вызовите
turnstile.render(), когда нужно создать виджеты. - Настройка виджета через параметры объекта JavaScript.
<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>Размеры виджета
В режимах Managed и Non-Interactive виджет Turnstile может иметь два фиксированных размера или гибкую ширину.
| Размер | Ширина | Высота | Сценарий использования |
|---|---|---|---|
| Normal | 300px | 65px | Стандартная реализация |
| Flexible | 100% (мин.: 300px) | 65px | Адаптивная вёрстка |
| Compact | 150px | 140px | Макеты с ограниченным местом |
normal: размер по умолчанию подходит для большинства десктопных и мобильных макетов. Выбирайте его, если на сайте или в форме достаточно горизонтального пространства.flexible: автоматически подстраивается под ширину контейнера и сохраняет минимально необходимое удобство использования. Подходит для адаптивной вёрстки, которая должна работать на экранах любого размера.compact: подходит для мобильных интерфейсов, боковых панелей и любых мест, где мало горизонтального пространства. Компактный виджет выше обычного, чтобы компенсировать меньшую ширину.
<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'
});Варианты темы
Настройте внешний вид виджета под дизайн вашего сайта.
auto(по умолчанию): автоматически подстраивается под тему, выбранную в системе посетителя. Для большинства реализаций рекомендуется именно этот режим: он учитывает предпочтения посетителя и обеспечивает наилучшую доступность.light: светлая тема со светлыми цветами и чётким контрастом. Она лучше всего смотрится на светлом фоне и обеспечивает высокий контраст для удобного чтения.dark: тёмная тема, рассчитанная на тёмные интерфейсы. Она хорошо подходит для тёмных интерфейсов, игровых сайтов и приложений с тёмной цветовой схемой.
<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'
});Режимы отображения
Режим отображения определяет, когда виджет становится видимым для посетителей.
always(по умолчанию): виджет виден с момента загрузки страницы. Для большинства реализаций это лучший вариант: посетитель сразу видит виджет и понимает, что проверка безопасности выполняется.execute: виджет появляется только после начала проверки. Это удобно, когда нужно управлять моментом его появления: например, показывать виджет, только когда посетитель начал заполнять форму или нажал кнопку отправки.interaction-only: виджет появляется только тогда, когда нужно действие посетителя, поэтому страница остаётся максимально чистой. Большинство посетителей никогда не увидят виджет, а подозрительные боты столкнутся с интерактивной проверкой.
<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'
});Режимы выполнения
Определите, когда запускается проверка и создаётся токен.
-
render(по умолчанию): проверка выполняется автоматически после вызоваrender()и защищает страницу сразу после загрузки виджета. Проверка выполняется в фоновом режиме, пока страница загружается, поэтому к моменту отправки данных токен уже готов. -
execute: проверка запускается после вызоваturnstile.execute()отдельно и даёт точный контроль над моментом проверки. Такой вариант удобен для многошаговых форм, условной проверки и тех случаев, когда проверку нужно отложить до момента, когда посетитель действительно отправляет данные. Проверка запускается только при необходимости, поэтому страница загружается быстрее, а посетителю работать удобнее.Типичные сценарии
- Многошаговые формы: запускайте проверку только на последнем шаге.
- Условная защита: проверяются только посетители, которые попадают под заданные условия.
- Оптимизация производительности: отложите проверку, чтобы сократить время первой загрузки страницы.
- Проверка по действию пользователя: посетитель запускает проверку вручную.
<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');Настройка языка
Задайте язык интерфейса виджета.
auto(по умолчанию): используется язык, заданный в браузере посетителя.- Коды конкретных языков: двухбуквенные коды ISO 639-1, например
es,fr,de. - Язык и регион: составные коды для региональных вариантов, например
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'
});Настройка функций обратного вызова
Обрабатывайте события виджета с помощью функций обратного вызова.
callback: срабатывает при успешном прохождении проверки.error-callback: срабатывает при ошибке во время проверки.expired-callback: срабатывает, когда истекает срок действия токена (до истечения времени ожидания).timeout-callback: срабатывает, когда истекает время ожидания интерактивной проверки.
Callback успешного завершения получает токен, который нужно проверить на вашем сервере через Siteverify API. Токен одноразовый и истекает через 300 секунд (пять минут).
<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');
}
});Рекомендации
- Всегда реализуйте обратный вызов success: он получает токен и запускает отправку формы или следующие шаги.
- Используйте error-callback, чтобы корректно обрабатывать ошибки и сообщать о них посетителю.
- Следите за истечением срока действия токенов и обновляйте проверку до того, как токен перестанет быть действительным.
- Обрабатывайте тайм-ауты, чтобы помочь посетителям пройти проверку.
Расширенные параметры конфигурации
Поведение при повторных попытках
Настройте, как Turnstile обрабатывает неуспешные проверки.
auto(по умолчанию): неудачные проверки повторяются автоматически. Автоматический повтор удобнее для посетителя, потому что временные сбои сети и ошибки обработки устраняются без его участия.never: отключает автоматические повторные попытки. Потребуется вмешательство вручную, зато вы полностью контролируете обработку ошибок в приложениях со своей логикой повторов.retry-interval: задаёт интервал между повторными попытками (по умолчанию: 8000ms) и позволяет выбрать баланс между быстрым восстановлением и нагрузкой на сервер.
<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>Поведение при обновлении
Настройте, как Turnstile обрабатывает истечение срока действия токена и тайм-ауты интерактивной проверки.
refresh-expired: управляет поведением при истечении срока действия токена (auto,manual,never).refresh-timeout: управляет поведением при истечении времени интерактивной проверки (auto,manual,never).
Преимущества
autoне требует действий от посетителя, но расходует больше ресурсов.manualдаёт посетителям контроль, но требует от них действий.neverтребует, чтобы вся логика обновления была реализована в вашем приложении.
В зависимости от требований к работе посетителей для истечения срока действия токена и для тайм-аутов интерактивной проверки можно задать разные стратегии.
<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>Пользовательские данные
Добавляйте к проверкам собственные идентификаторы и данные.
action: собственный идентификатор для аналитики и различения виджетов (не более 32 символов).cData: произвольные данные, которые возвращаются при проверке токена (не более 255 символов).
Сценарии использования
- Отслеживание действий: различайте в аналитике формы входа, регистрации, обратной связи и другие.
- Контекст посетителя: передавайте идентификаторы посетителей, данные сессии или другие контекстные сведения.
- A/B-тестирование: отслеживайте разные конфигурации виджета или варианты страницы.
- Выявление мошенничества: добавьте дополнительный контекст для оценки рисков.
<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>Интеграция с формой
Настройка интеграции Turnstile с формами HTML.
Если этот параметр включён, Turnstile автоматически создаёт скрытый <input> с токеном проверки. Он отправляется вместе с остальными данными формы, поэтому проверка на сервере не требует дополнительных усилий.
response-field: определяет, создавать ли скрытое поле формы с токеном (default: true)response-field-name: собственное имя скрытого поля формы (default: cf-turnstile-response)
Преимущества
- Автоматическая интеграция с формой означает, что токен уходит вместе с отправкой формы и дополнительный JavaScript не нужен.
- Собственные имена полей помогают избежать конфликтов с уже существующими полями формы.
- Отключённые поля ответа дают полный контроль над обработкой токена в сложных сценариях с формами.
<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>Полный справочник по настройке
| Параметры отрисовки в JavaScript | Атрибут data | Описание |
|---|---|---|
sitekey |
data-sitekey |
У каждого виджета есть sitekey. Он привязан к конфигурации этого виджета и создаётся вместе с ним. |
action |
data-action |
Произвольное значение, которое позволяет различать в аналитике виджеты с одним sitekey и возвращается при проверке токена. Допускается не более 32 буквенно-цифровых символов, включая _ и -. |
cData |
data-cdata |
Произвольные данные клиента, которые можно связать с проверкой на всё время её выдачи и получить обратно при проверке токена. Допускается не более 255 буквенно-цифровых символов, включая _ и -. |
callback |
data-callback |
Обратный вызов JavaScript, который выполняется при успешном прохождении проверки. В него передаётся токен, пригодный для проверки. |
error-callback |
data-error-callback |
Обратный вызов JavaScript, который выполняется при ошибке, например при сетевом сбое или неудачной проверке. Смотрите Ошибки на стороне клиента. |
execution |
data-execution |
Параметр execution определяет, когда виджет получает токен, и может принимать значение render (по умолчанию) или по execute. См. Режимы выполнения, где это описано подробнее. |
expired-callback |
data-expired-callback |
Обратный вызов JavaScript, который выполняется при истечении срока действия токена и не сбрасывает виджет. |
before-interactive-callback |
data-before-interactive-callback |
Обратный вызов JavaScript, который выполняется перед переходом проверки в интерактивный режим. |
after-interactive-callback |
data-after-interactive-callback |
Обратный вызов JavaScript, который выполняется после выхода проверки из интерактивного режима. |
unsupported-callback |
data-unsupported-callback |
Обратный вызов JavaScript, который выполняется, если Turnstile не поддерживает клиент или браузер посетителя. |
theme |
data-theme |
Тема виджета. Допустимые значения: light, dark, auto. По умолчанию используется auto, который учитывает настройки посетителя. Можно принудительно задать light или dark, указав соответствующую тему. |
language |
data-language |
Отображаемый язык, допустимые значения: auto (по умолчанию), чтобы использовать язык, выбранный посетителем, либо двухбуквенный код языка по ISO 639-1 (например, en) либо код языка и страны (например, en-US). См. список поддерживаемых языков, где это описано подробнее. |
tabindex |
data-tabindex |
Значение tabindex для iframe Turnstile, нужное для доступности. По умолчанию используется 0. |
timeout-callback |
data-timeout-callback |
Обратный вызов JavaScript, который выполняется, если интерактивная проверка не была решена за отведённое время. Обратный вызов сбрасывает виджет, чтобы посетитель мог пройти проверку заново. |
response-field |
data-response-field |
Логическое значение, которое определяет, создавать ли элемент input с токеном ответа. Значение по умолчанию: true. |
response-field-name |
data-response-field-name |
Название элемента input, по умолчанию cf-turnstile-response. |
size |
data-size |
Размер виджета. Допустимые значения: normal, flexible, compact. |
retry |
data-retry |
Определяет, должен ли виджет автоматически повторять попытку получить токен после неудачи. Значение по умолчанию: auto, который автоматически повторяет попытку. Значение можно изменить на never, чтобы отключить повторные попытки при ошибке. |
retry-interval |
data-retry-interval |
Когда retry имеет значение auto, retry-interval задаёт интервал между повторными попытками в миллисекундах. Значение должно быть положительным целым числом меньше 900000, по умолчанию 8000. |
refresh-expired |
data-refresh-expired |
Автоматически обновляет токен по истечении срока действия. Принимает значения: auto, manual, или never, по умолчанию auto. |
refresh-timeout |
data-refresh-timeout |
Определяет, должен ли виджет автоматически обновляться, если интерактивная проверка началась и завершилась по тайм-ауту. Возможные значения: auto (автоматически обновляется при истечении времени ожидания взаимодействия), manual (посетителю предлагается обновить проверку вручную) или never (будет показано истечение времени ожидания), значение по умолчанию: auto. Применяется только к виджетам в режиме Managed. |
appearance |
data-appearance |
Параметр appearance управляет тем, когда виджет виден. Возможные значения: always (по умолчанию), execute, или interaction-only. См. Режимы отображения, где это описано подробнее. |
feedback-enabled |
data-feedback-enabled |
Позволяет Cloudflare собирать отзывы посетителей при сбое виджета. Возможные значения: true (по умолчанию) или false. |
offlabel-show-privacy |
data-offlabel-show-privacy |
Показывает ссылку на политику конфиденциальности для виджетов Turnstile без брендирования. Возможные значения: true (по умолчанию) или false. |
offlabel-show-help |
data-offlabel-show-help |
Показывает ссылку на справку для виджетов Turnstile без брендирования. Возможные значения: true (по умолчанию) или false. |
Примеры
<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>