跳转到内容

验证 Captcha

服务器端点可以用作 REST API 端点来运行身份验证、数据库访问和校验等功能,而无需向客户端暴露敏感数据。

在本指南中,将使用一个 API 路由来验证谷歌 reCAPTCHA v3,而无需向客户端暴露密钥。

  • 一个启用了 SSR (output: 'server') 的项目
  1. 创建一个 POST 端点,它接受 recaptcha 数据,然后使用 reCAPTCHA 的 API 进行验证。在这里,你可以安全地定义密钥或读取环境变量。

    src/pages/recaptcha.js
    export async function POST({ request }) {
    const data = await request.json();
    const recaptchaURL = 'https://www.google.com/recaptcha/api/siteverify';
    const requestHeaders = {
    'Content-Type': 'application/x-www-form-urlencoded'
    };
    const requestBody = new URLSearchParams({
    secret: "YOUR_SITE_SECRET_KEY", // This can be an environment variable
    response: data.recaptcha // The token passed in from the client
    });
    const response = await fetch(recaptchaURL, {
    method: "POST",
    headers: requestHeaders,
    body: requestBody.toString()
    });
    const responseData = await response.json();
    return new Response(JSON.stringify(responseData), { status: 200 });
    }
  2. 从客户端脚本使用 fetch 访问你的端点

    src/pages/index.astro
    <html>
    <head>
    <script is:inline src="https://www.google.com/recaptcha/api.js"></script>
    </head>
    <body>
    <button class="g-recaptcha"
    data-sitekey="PUBLIC_SITE_KEY"
    data-callback="onSubmit"
    data-action="submit"> Click me to verify the captcha challenge! </button>
    <script is:inline>
    function onSubmit(token) {
    fetch("/recaptcha", {
    method: "POST",
    body: JSON.stringify({ recaptcha: token })
    })
    .then((response) => response.json())
    .then((gResponse) => {
    if (gResponse.success) {
    // Captcha verification was a success
    } else {
    // Captcha verification failed
    }
    })
    }
    </script>
    </body>
    </html>
贡献 社区 赞助