支持 Cloudflare Turnstile 的 CAPTCHA
Cloudflare Turnstile 是一个友好、免费的 CAPTCHA 替代品,它可以与 Supabase Edge Functions 无缝协作,保护你的表单。在 GitHub 上查看。
设置 #
🌐 Setup
- 按照这些步骤来设置一个新站点:https://developers.cloudflare.com/turnstile/get-started/
- 将 Cloudflare Turnstile 小部件添加到你的网站:https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/
代码 #
🌐 Code
在你的项目中创建一个新函数:
🌐 Create a new function in your project:
1supabase functions new cloudflare-turnstile然后把代码加到 index.ts 文件里:
🌐 And add the code to the index.ts file:
1import { withSupabase } from 'npm:@supabase/server@^1'23console.log('Hello from Cloudflare Trunstile!')45function ips(req: Request) {6 return req.headers.get('x-forwarded-for')?.split(/\s*,\s*/)7}89// `withSupabase` handles CORS and preflight requests for you.10export default {11 fetch: withSupabase({ auth: 'none' }, async (req) => {12 const { token } = await req.json()13 const clientIps = ips(req) || ['']14 const ip = clientIps[0]1516 // Validate the token by calling the17 // "/siteverify" API endpoint.18 let formData = new FormData()19 formData.append('secret', Deno.env.get('CLOUDFLARE_SECRET_KEY') ?? '')20 formData.append('response', token)21 formData.append('remoteip', ip)2223 const url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify'24 const result = await fetch(url, {25 body: formData,26 method: 'POST',27 })2829 const outcome = await result.json()30 console.log(outcome)31 if (outcome.success) {32 return Response.json({ success: true })33 }34 return Response.json({ success: false })35 }),36}部署服务器端验证的 Edge Functions #
🌐 Deploy the server-side validation Edge Functions
1supabase functions deploy cloudflare-turnstile --no-verify-jwt2supabase secrets set CLOUDFLARE_SECRET_KEY=your_secret_key从你的网站调用这个函数 #
🌐 Invoke the function from your site
1const { data, error } = await supabase.functions.invoke('cloudflare-turnstile', {2 body: { token },3})