Turnstile 是 Cloudflare 近期推出的一项免费验证码服务,可以用来验证当前用户是否是真人。与 CAPTCHA 不同,它不要求我们使用 Cloudflare 网络,所以任何网站都可以使用这项服务。对我这种 Vercel 重度用户来说,Turnstile 非常合适。
对初创 AI 产品来说,我们既怕用户滥用我们的服务,毕竟每个 token 都要花钱(甚至要花不少钱);又怕复杂的登录注册会把用户吓跑。于是验证码就成为了比较好的选择,毕竟,只要不是自动化批量请求,自然人用户随便用用,基本上不会产生问题。
Turnstile 使用 JS 脚本收集用户在当前网页上的交互,并通过一些深度学习的模型来判断当前用户是否是真人,这样一来就可以减少验证码出现的频率,提升用户体验。另外,免费版 Turnstile 可以不限次数地使用,对于我这种白嫖党来说,也是重大利好。
所以,综上,我近期给公司的 API 加上了 Turnstile,以避免可能产生的滥用。
使用 Turnstile 非常简单,这里简单说一下。
- 首先,我们要注册一个 Cloudflare 用户。这一步应该有手就行,我就不多说了。
- 接下来,创建 Turnstile 应用。
- 然后复制保存 Site Key 和 Secret Key。
- 在项目中集成 Turnstile。
Turnstile 的工作逻辑是这样的:
- 我们往页面里嵌入 Turnstile JS
- Turnstile JS 会收集用户的各种信息,作为判断用户是否是真人的依据
- 当用户需要与 API 交互的时候,Turnstile JS 会生成一个 token,用户需要把 token 一起提交给 API
- API 拿到 token,去 Turnstile Server 检查该 token 代表的用户是否是真人
- 如果是,就继续执行;如果不是,就返回错误
- 当然,还有一些衍生逻辑,比如验证来源,token 超时失效等等
上面这些逻辑手动实现并不复杂,如果有现成的库,使用起来就更简单。我厂的 SoulScript 使用 Nuxt3 框架,有官方推荐的模组 @nuxtjs/turnstile,所以我只要按照文档进行配置,就可以在项目当中使用 Turnstile。
不过实际测试之后,我发现还是有点问题:
- 免费版(Managed)的验证码窗口不是太好看,体积也不小,插入高设计感的网站,视觉效果不理想
- 如果在用到验证码的时候再检查用户状态,需要花费几秒到十几秒的时间,会耽误用户干正事。
所以我加了个开关,没发现问题就先关上,等用量上去的时候再开。
以前我比较倾向用户体系和注册登录,因为这样可以收集更多用户信息,也比较方便我们控制用户的行为。不过现在,流量越来越贵、用户越来越难搞,同时,免费服务、Serverless 越来越多,也许,local storage + 真人验证才是下一阶段我应该首选的策略。
欢迎吐槽,共同进步