跳转到内容
This is an unmaintained snapshot of the Astro v4 docs. View the latest docs.

校验验证码

服务器端点可以作为 REST API 端点使用,通常用于运行诸如身份验证、数据库访问和验证等操作,而无需将敏感数据暴露给客户端。

在本节示例中,将使用一个 API 路由来验证 Google reCAPTCHA v3,而不会将密钥直接暴露给客户端。

  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", // 这可以是一个环境变量
    response: data.recaptcha // 从客户端传入的令牌
    });
    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) {
    // 验证码校验成功
    } else {
    // 验证码校验失败
    }
    })
    }
    </script>
    </body>
    </html>
贡献

你有什么想法?

社区