验证 Captcha
服务器端点可以用作 REST API 端点来运行身份验证、数据库访问和校验等功能,而无需向客户端暴露敏感数据。
在本指南中,将使用一个 API 路由来验证谷歌 reCAPTCHA v3,而无需向客户端暴露密钥。
先决条件
标题为“先决条件”的部分- 一个启用了 SSR (
output: 'server'
) 的项目
-
创建一个
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 variableresponse: 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 });} -
从客户端脚本使用
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>