likes
comments
collection
share

在 Next.js 14 中集成 Cloudflare Turnstile如果你用过国外的 SaaS 工具,一定见过这张

作者站长头像
站长
· 阅读数 293

什么是 Cloudflare Turnstile

如果你用过国外的 SaaS 工具,一定见过下面这张动图的页面:

在 Next.js 14 中集成 Cloudflare Turnstile如果你用过国外的 SaaS 工具,一定见过这张

这就是 Cloudflare Turnstile,它是 Cloudflare 在 2022 年推出的一个检测机器人的验证服务。

如果你用过 Google reCAPTCHA,一定会看烦了里面的楼梯、斑马线、巴士、摩托车的图片,那就好像我们在免费给谷歌提供 AI 图片标记似的。

Cloudflare Turnstile 就是用来替代 Google reCAPTCHA 的,Turnstile 只需要用户用鼠标点击一下就能完成验证,就像开头的那张动图。这种做法真正在用户友好和安全校验之间做到了平衡。

在开始我们今天的教程前,还需要先罗列一下 Cloudflare Turnstile 的优点和使用场景,它们正是我们要学习使用 Cloudflare Turnstile 的理由;

优点:

  • 用户体验好:用户只需要点击一下,甚至可能感觉不到验证的存在
  • 注重隐私:Turnstile 不会收集用户的个人信息
  • 智能验证:利用 Cloudflare 的全球网络数据来判断访问者是否为机器人
  • 易于集成:提供了简单的 API 和多种集成选项
  • 免费使用:对所有 Cloudflare 用户免费
  • 开放兼容:Turnstile 提供了与 reCAPTCHA 兼容的 API,便于从 reCAPTCHA 迁移

使用场景:

  • 用户注册和登录:在用户创建新账户或登录时使用 Turnstile 可以有效防止自动化脚本批量注册或进行暴力破解攻击

  • 评论系统:Turnstile 可以有效阻止机器人大量发布广告或恶意链接

  • 电子商务交易:在线购物网站可以在结账过程中使用Turnstile,这样助于防止刷单、账户劫持等欺诈行为

  • 文件上传:使用Turnstile可以防止自动化工具滥用上传功能

  • API保护:使用Turnstile来限制API的滥用

集成 Cloudflare Turnstile

1. 获取 Turnstile 站点密钥

首先,登录 Cloudflare 控制台,创建一个 Turnstile 站点,获取站点密钥(Site Key)和密钥(Secret Key)。

在 Next.js 14 中集成 Cloudflare Turnstile如果你用过国外的 SaaS 工具,一定见过这张

2. 安装依赖

npm install @marsidev/react-turnstile

3. 创建 Turnstile 组件

新建一个文件,比如 components/TurnstileWidget.tsx:

import React from 'react';
import { Turnstile } from '@marsidev/react-turnstile';

interface TurnstileWidgetProps {
  onVerify: (token: string) => void;
}

const TurnstileWidget: React.FC<TurnstileWidgetProps> = ({ onVerify }) => {
  return (
    <Turnstile
      siteKey={process.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY || ''}
      onSuccess={onVerify}
    />
  );
};

export default TurnstileWidget;

4. 在表单中使用 Turnstile

修改表单组件,例如 components/ContactForm.tsx:

import React, { useState } from 'react';
import TurnstileWidget from './TurnstileWidget';

const ContactForm = () => {
  const [turnstileToken, setTurnstileToken] = useState<string | null>(null);

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    if (!turnstileToken) {
      alert('请等待验证完成');
      return;
    }
    // 这里处理表单提交逻辑,记得将 turnstileToken 发送到后端验证
    console.log('表单提交', { turnstileToken });
  };

  return (
    <form onSubmit={handleSubmit}>
      {/* 其他表单字段 */}
      <TurnstileWidget onVerify={setTurnstileToken} />
      <button type="submit">提交</button>
    </form>
  );
};

export default ContactForm;

5. 创建 API 路由进行验证

在 app/api 目录下创建 verify-turnstile.ts:

import { NextResponse } from 'next/server';
import axios from 'axios';

export async function POST(req: Request) {
  const body = await req.json();
  const { token } = body;

  try {
    const response = await axios.post(
      'https://challenges.cloudflare.com/turnstile/v0/siteverify',
      new URLSearchParams({
        secret: process.env.TURNSTILE_SECRET_KEY || '',
        response: token,
      }),
      {
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      }
    );

    if (response.data.success) {
      return NextResponse.json({ success: true });
    } else {
      return NextResponse.json({ success: false, error: '验证失败' }, { status: 400 });
    }
  } catch (error) {
    console.error('验证出错:', error);
    return NextResponse.json({ success: false, error: '服务器错误' }, { status: 500 });
  }
}

6. 一些高级用法

  • 本地化支持

    如果你的网站有做国际化,那么你也可以为 Turnstile 配置展示的语言:

    <Turnstile
      // ...其他属性
      options={{
        language: 'zh-CN', // 设置为中文
      }}
    />
    
  • 主题定制

    你可以通过自定义样式来修改 Turnstile 的外观,例如:

    .cf-turnstile {
      margin-top: 20px;
      margin-bottom: 20px;
    }
    

总结

Cloudflare 被程序员们称为「赛博佛祖」,是因为他们提供了很多程序员需要的免费服务,Cloudflare Turnstile 也是其中之一,也是从 Cloudflare Turnstile 推出后,很多个人或小团队的产品都从 Google reCAPTCHA 迁移走了。现在我们海外网站冲浪的时候,会发现 Cloudflare Turnstile 出现的频率比 Google reCAPTCHA 的出现频率要高得多,可见 Cloudflare Turnstile 已经获得市场的认可了。

从本文的教程也能看出来,Next.js 项目集成 Cloudflare Turnstile 并没有什么难度,所以如果你的网站或者产品有稳定的用户,不妨花半小时为网站添加一个安全校验。

关于我

我是一名前端工程师,Next.js 手艺人,AI降临派。

今年致力于 Next.js 和 Node.js 领域的开源项目开发和知识分享。

转载自:https://juejin.cn/post/7401463939593011210
评论
请登录