chore: optimize validate captcha

This commit is contained in:
javayhu 2025-06-28 10:09:50 +08:00
parent 66567cfecd
commit 05b90fb0a7
2 changed files with 46 additions and 13 deletions

View File

@ -0,0 +1,36 @@
'use server';
import { validateTurnstileToken } from '@/lib/captcha';
import { createSafeActionClient } from 'next-safe-action';
import { z } from 'zod';
// Create a safe action client
const actionClient = createSafeActionClient();
// Captcha validation schema
const captchaSchema = z.object({
captchaToken: z.string().min(1, { message: 'Captcha token is required' }),
});
// Create a safe action for captcha validation
export const validateCaptchaAction = actionClient
.schema(captchaSchema)
.action(async ({ parsedInput }) => {
const { captchaToken } = parsedInput;
try {
const isValid = await validateTurnstileToken(captchaToken);
return {
success: true,
valid: isValid,
};
} catch (error) {
console.error('Captcha validation error:', error);
return {
success: false,
valid: false,
error: error instanceof Error ? error.message : 'Something went wrong',
};
}
});

View File

@ -1,5 +1,6 @@
'use client'; 'use client';
import { validateCaptchaAction } from '@/actions/validate-captcha';
import { AuthCard } from '@/components/auth/auth-card'; import { AuthCard } from '@/components/auth/auth-card';
import { FormError } from '@/components/shared/form-error'; import { FormError } from '@/components/shared/form-error';
import { FormSuccess } from '@/components/shared/form-success'; import { FormSuccess } from '@/components/shared/form-success';
@ -15,7 +16,7 @@ import {
import { Input } from '@/components/ui/input'; import { Input } from '@/components/ui/input';
import { websiteConfig } from '@/config/website'; import { websiteConfig } from '@/config/website';
import { authClient } from '@/lib/auth-client'; import { authClient } from '@/lib/auth-client';
import { isTurnstileEnabled, validateTurnstileToken } from '@/lib/captcha'; import { isTurnstileEnabled } from '@/lib/captcha';
import { getUrlWithLocaleInCallbackUrl } from '@/lib/urls/urls'; import { getUrlWithLocaleInCallbackUrl } from '@/lib/urls/urls';
import { DEFAULT_LOGIN_REDIRECT, Routes } from '@/routes'; import { DEFAULT_LOGIN_REDIRECT, Routes } from '@/routes';
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from '@hookform/resolvers/zod';
@ -89,18 +90,14 @@ export const RegisterForm = ({
const onSubmit = async (values: z.infer<typeof RegisterSchema>) => { const onSubmit = async (values: z.infer<typeof RegisterSchema>) => {
// Validate captcha token if turnstile is enabled // Validate captcha token if turnstile is enabled
if (turnstileEnabled && values.captchaToken) { if (turnstileEnabled && values.captchaToken) {
try { const captchaResult = await validateCaptchaAction({
const isCaptchaValid = await validateTurnstileToken( captchaToken: values.captchaToken,
values.captchaToken });
);
if (!isCaptchaValid) { if (!captchaResult?.data?.success || !captchaResult?.data?.valid) {
console.log('register, captcha invalid:', values.captchaToken); console.error('register, captcha invalid:', values.captchaToken);
setError(t('captchaInvalid') || 'Captcha verification failed'); const errorMessage = captchaResult?.data?.error || t('captchaInvalid');
return; setError(errorMessage);
}
} catch (error) {
console.error('register, captcha validation error:', error);
setError(t('captchaError') || 'Captcha verification error');
return; return;
} }
} }