diff --git a/apps/desktop/src/renderer/src/lib/auth.ts b/apps/desktop/src/renderer/src/lib/auth.ts index 890e62086..793923b3c 100644 --- a/apps/desktop/src/renderer/src/lib/auth.ts +++ b/apps/desktop/src/renderer/src/lib/auth.ts @@ -64,9 +64,10 @@ export const loginHandler = async ( args?: { email?: string password?: string + headers?: Record }, ) => { - const { email, password } = args ?? {} + const { email, password, headers } = args ?? {} if (IN_ELECTRON && provider !== "credential") { window.open(`${WEB_URL}/login?provider=${provider}`) } else { @@ -75,7 +76,7 @@ export const loginHandler = async ( window.location.href = "/login" return } - return signIn.email({ email, password }) + return signIn.email({ email, password }, { headers }) } signIn.social({ diff --git a/apps/desktop/src/renderer/src/modules/auth/Form.tsx b/apps/desktop/src/renderer/src/modules/auth/Form.tsx index b5ef428c2..8e3bcc892 100644 --- a/apps/desktop/src/renderer/src/modules/auth/Form.tsx +++ b/apps/desktop/src/renderer/src/modules/auth/Form.tsx @@ -42,10 +42,16 @@ export function LoginWithPassword({ runtime }: { runtime: LoginRuntime }) { const { present } = useModalStack() const { dismiss } = useCurrentModal() + const recaptchaRef = useRef(null) + async function onSubmit(values: z.infer) { + const token = await recaptchaRef.current?.executeAsync() const res = await loginHandler("credential", runtime, { email: values.email, password: values.password, + headers: { + "x-token": `r2:${token}`, + }, }) if (res?.error) { toast.error(res.error.message) @@ -117,6 +123,7 @@ export function LoginWithPassword({ runtime }: { runtime: LoginRuntime }) { )} />
+ diff --git a/apps/desktop/src/renderer/src/modules/power/my-wallet-section/claim-daily-reward.tsx b/apps/desktop/src/renderer/src/modules/power/my-wallet-section/claim-daily-reward.tsx index 8e4ca7faa..31e4d9fae 100644 --- a/apps/desktop/src/renderer/src/modules/power/my-wallet-section/claim-daily-reward.tsx +++ b/apps/desktop/src/renderer/src/modules/power/my-wallet-section/claim-daily-reward.tsx @@ -23,13 +23,7 @@ export const ClaimDailyReward = () => { <> - {env.VITE_RECAPTCHA_V2_SITE_KEY && ( - - )} + diff --git a/apps/ssr/client/pages/(login)/forget-password.tsx b/apps/ssr/client/pages/(login)/forget-password.tsx index c42648b2c..2af197b8c 100644 --- a/apps/ssr/client/pages/(login)/forget-password.tsx +++ b/apps/ssr/client/pages/(login)/forget-password.tsx @@ -19,6 +19,8 @@ import { Input } from "@follow/components/ui/input/index.js" import { env } from "@follow/shared/env" import { zodResolver } from "@hookform/resolvers/zod" import { useMutation } from "@tanstack/react-query" +import { useRef } from "react" +import ReCAPTCHA from "react-google-recaptcha" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { useNavigate } from "react-router" @@ -38,13 +40,23 @@ export function Component() { }, }) + const recaptchaRef = useRef(null) + const { isValid } = form.formState const updateMutation = useMutation({ mutationFn: async (values: z.infer) => { - const res = await forgetPassword({ - email: values.email, - redirectTo: `${env.VITE_WEB_URL}/reset-password`, - }) + const token = await recaptchaRef.current?.executeAsync() + const res = await forgetPassword( + { + email: values.email, + redirectTo: `${env.VITE_WEB_URL}/reset-password`, + }, + { + headers: { + "x-token": `r2:${token}`, + }, + }, + ) if (res.error) { throw new Error(res.error.message) } @@ -98,6 +110,11 @@ export function Component() { )} /> +
diff --git a/packages/shared/src/env.ts b/packages/shared/src/env.ts index ca5fb1faf..4df83409c 100644 --- a/packages/shared/src/env.ts +++ b/packages/shared/src/env.ts @@ -20,6 +20,9 @@ export const envSchema = { VITE_EXTERNAL_API_URL: z.string().optional(), VITE_WEB_PROD_URL: z.string().optional(), VITE_WEB_DEV_URL: z.string().optional(), + + VITE_RECAPTCHA_V2_SITE_KEY: z.string().default("6LdxQ-sqAAAAAN-_za3hUdFkJEO_cu2xHSpLKVan"), + VITE_RECAPTCHA_V3_SITE_KEY: z.string().default("6LdG-asqAAAAAEXr96565MKbRvxGEv31XEykRSHV"), } export const isDev = false