客户端渲染 · Cloudflare Turnstile 文档

内容

您可以通过隐式或显式渲染在您的网页上初始化和自定义 Turnstile 小部件。

警告

api.js 必须从下面所述的确切 URL 获取。代理或缓存此文件将在未来更新发布时导致 Turnstile 失败。

注意

请参阅 演示 ↗ 及其 源代码 ↗

HTML 会扫描具有 cf-turnstile 类名的元素:

 data-sitekey="你的站点密钥" data-callback="javascriptCallback"

一旦挑战被解决,令牌将传递给成功回调。此令牌必须通过我们的网站验证端点进行验证。令牌只能验证一次,不能被重复使用。

警告

使用 siteverify API 强制执行 Turnstile 令牌至关重要。Turnstile 令牌可能无效、过期或已被兑换。不验证令牌将使您的实现存在重大漏洞。

注意

一旦令牌被发出,它可以在接下来的300秒内进行验证。300秒后,令牌将不再有效,需要解决另一个挑战。

要配置挑战,请参阅 配置,其中包含数据属性和渲染参数。

Turnstile 通常用于保护网站上的表单,例如登录表单、联系表单等。在插入 JavaScript 脚本标签后,您可以将 <div class="cf-turnstile"></div> 嵌入到您的网站中以保护您的表单。

<form action="/login" method="POST"> <input type="text" placeholder="用户名" /> <input type="password" placeholder="密码" /> <div class="cf-turnstile" data-sitekey="<YOUR_SITE_KEY>"></div> <button type="submit" value="Submit">登录</button>

添加了一个名为 cf-turnstile-response 的隐形输入,并将与其他字段一起发送到服务器。

注意

表单并不因为渲染了一个小部件而受到保护。渲染小部件所产生的相应令牌也需要使用 siteverify API 进行验证。

您可以通过替换以下脚本来禁用隐式渲染:

https://challenges.cloudflare.com/turnstile/v0/api.js

收件人:

https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit

使用 render=explicit 时,带有 cf-turnstile 类的 HTML 元素将不会显示挑战。必须按照以下步骤调用 turnstile.render 函数。要结合这两个选项,请传递查询字符串 ?render=explicit&onload=onloadTurnstileCallback

https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=onloadTurnstileCallback

注意

请参阅 演示 ↗ 及其 源代码 ↗

  1. 插入下面的 JavaScript 标签和相关代码。确保您已将 .cf-turnstile 的类名重命名为 #example-container(如果您没有设置如上所示的 render=explicit 查询字符串选项,它仍然会以其他方式呈现)。一旦脚本嵌入,您将可以访问一个具有多个可自定义回调选项的全局函数。为了使以下函数正常工作,页面必须包含一个 ID 为 example-container 的 HTML 元素。
 src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=onloadTurnstileCallback"
window.onloadTurnstileCallback = function () { turnstile.render("#example-container", { sitekey: "<YOUR_SITE_KEY>", callback: function (token) { console.log(`挑战成功 ${token}`);

或:

<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"></script>
// 如果使用同步加载,将在 DOM 准备好后调用turnstile.ready(function () { turnstile.render("#example-container", { sitekey: "<YOUR_SITE_KEY>", callback: function (token) { console.log(`挑战成功 ${token}`);

旋转门可以通过在全局 window 对象中调用 turnstile.render() 函数进行程序化加载。

turnstile.render: function (container: string | HTMLElement, params: RenderParameters) 渲染函数接受一个 HTML 小部件的参数。

如果调用成功,函数返回一个 widgetId (字符串)。如果调用不成功,函数返回 undefined

除了 render() 函数,Turnstile 还支持通过 turnstile.getResponse(widgetId: string) 函数从 widgetId 获取小部件的响应。如果省略 widgetIdturnstile.getResponse() 将返回最后创建的小部件的响应。

经过一段时间,部件可能会过期,需要刷新(通过调用 turnstile.reset(widgetId: string))。如果部件已过期,turnstile.getResponse() 仍然会返回最后的响应,但该响应将不再有效,因为它已过期。

您可以通过订阅 expired-callback 或使用 turnstile.isExpired(widgetId: string) 函数来检查小部件是否已过期,如果小部件已过期,则返回 true。如果您省略 widgetIdturnstile.isExpired() 将返回最后创建的小部件是否已过期。

如果某个小部件超时、过期或需要重新加载,您可以使用 turnstile.reset(widgetId: string) 函数来重置该小部件。

一旦不再需要小部件,可以使用 turnstile.remove(widgetId: string) 从页面中移除它。这不会调用任何回调,并将移除所有相关的 DOM 元素。

要卸载 Turnstile,turnstile.render() 将返回一个 ID,您可以将其传递给 turnstile.remove()

在令牌过期前几秒,expired-callback 被调用。

refresh-expireddata-refresh-expired 参数定义了当 Turnstile 小部件的令牌过期时的行为。

默认情况下,参数设置为 auto,这将自动指示 Turnstile 通过重新运行挑战来获取新令牌。在挑战再次解决后,如果指定了 callback,则会使用新令牌调用该回调。

访客还可以通过将 refresh-expired 参数设置为 manual 来手动获取新令牌。

此外,指定 never 将不会导致令牌的重新生成,使用 Turnstile 的应用程序将负责获取新的 Turnstile 令牌。

当选择管理模式时,Turnstile 可能会在某些时候向访客呈现一个互动挑战。如果这个互动挑战被呈现但在给定的时间内没有解决,它将超时,Turnstile 的挑战过程将需要重新启动。

refresh-timeoutdata-refresh-timeout 参数定义了当交互式挑战遇到超时时的行为。默认情况下,组件会自动刷新(auto)。然而,组件也可以配置为访客需要手动刷新超时的组件(manual),或者组件只能由应用程序外部刷新(refresh-timeout="never"),例如通过调用 Turnstile 的 reset() 函数。

当一个小部件遇到交互超时时,timeout-callback 被调用。

默认情况下,Turnstile 令牌在小部件渲染时为访客获取(即使在隐形模式下)。然而,在某些情况下,应用程序可能希望嵌入 Turnstile,但推迟在某个时间点运行挑战。这时可以使用执行模式来控制挑战何时运行以及令牌何时生成。

有两个选项:

  • 挑战在调用 render() 函数后自动运行。
  • 挑战在调用了 render() 函数后运行,通过单独调用 turnstile.execute(container: string | HTMLElement, jsParams?: RenderParameters) 函数。

这将小部件的外观和渲染与其执行分离。

如果一个小部件是可见的,它的外观可以通过 appearance 参数进行控制。

默认情况下,appearance 对于可见的控件类型设置为 always。然而,如果 appearance 设置为 execute,控件将在挑战开始后才会变得可见。这在 execute()render() 之后被调用的情况下是有帮助的。如果 appearance 设置为 interaction-only,控件仅在需要交互的情况下才会变得可见。

请参阅 小部件类型 以按类型和状态查看小部件。

转闸小部件可以在使用管理模式或非交互模式时具有两种不同的固定大小或灵活的宽度大小:

大小

宽度

高度

正常

300像素

65像素

灵活的

100%(最小:300px)

65像素

紧凑

150像素

140像素

总结
本文介绍了如何在网页上初始化和自定义Turnstile小部件,包括隐式和显式渲染方式。使用时需确保从指定URL获取`api.js`,否则可能导致未来更新失败。小部件通过`cf-turnstile`类名识别,并在挑战成功后返回一个令牌,该令牌必须通过siteverify API进行验证。令牌有效期为300秒,过期后需重新解决挑战。可以通过设置不同的参数来配置挑战的行为,如`refresh-expired`和`refresh-timeout`,以控制令牌过期后的处理方式。Turnstile通常用于保护网站表单,确保在表单提交时验证令牌的有效性。小部件的外观和执行模式也可以根据需求进行调整,支持多种尺寸和样式。最后,提供了JavaScript渲染参数的详细说明,以便开发者根据具体需求进行配置。