diff --git a/frontend/desktop/package.json b/frontend/desktop/package.json index 4928077579a..b0bb8b60084 100644 --- a/frontend/desktop/package.json +++ b/frontend/desktop/package.json @@ -28,13 +28,14 @@ "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@kubernetes/client-node": "^0.18.1", + "@marsidev/react-turnstile": "^0.5.3", "@prisma/client": "^5.10.2", "@sealos/driver": "workspace:^", "@sealos/ui": "workspace:^", "@tanstack/react-query": "^4.35.3", "axios": "^1.5.1", "clsx": "^1.2.1", - "cors": "^2.8.5", + "cors": "^2.8.5", "dayjs": "^1.11.10", "eslint": "8.38.0", "eslint-config-next": "13.3.0", @@ -53,6 +54,7 @@ "next-i18next": "^13.3.0", "next-pwa": "^5.6.0", "nprogress": "^0.2.0", + "prisma": "^5.10.2", "qrcode.react": "^3.1.0", "randexp": "^0.5.3", "react": "18.2.0", @@ -65,8 +67,7 @@ "sharp": "^0.32.6", "uuid": "^9.0.1", "xml2js": "^0.6.2", - "zustand": "^4.4.1", - "prisma": "^5.10.2" + "zustand": "^4.4.1" }, "devDependencies": { "@testing-library/jest-dom": "^6.1.3", @@ -86,7 +87,6 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "prettier": "^2.8.8" - }, "pnpm": { "supportedArchitectures": { diff --git a/frontend/desktop/src/components/signin/auth/useSms.tsx b/frontend/desktop/src/components/signin/auth/useSms.tsx index d1fa03e9aa4..18a11188927 100644 --- a/frontend/desktop/src/components/signin/auth/useSms.tsx +++ b/frontend/desktop/src/components/signin/auth/useSms.tsx @@ -85,7 +85,13 @@ export default function useSms({ )(); }; - const SmsModal = () => { + const SmsModal = ({ + onAfterGetCode, + getCfToken + }: { + getCfToken?: () => string | undefined; + onAfterGetCode?: () => void; + }) => { const [remainTime, setRemainTime] = useState(_remainTime.current); useEffect(() => { @@ -107,8 +113,10 @@ export default function useSms({ _remainTime.current = 60; try { + const cfToken = getCfToken?.(); const res = await request.post>('/api/auth/phone/sms', { - phoneNumbers: getValues('phoneNumber') + phoneNumbers: getValues('phoneNumber'), + cfToken }); if (res.code !== 200 || res.message !== 'successfully') { throw new Error('Get code failed'); @@ -117,6 +125,8 @@ export default function useSms({ showError(t('Get code failed') || 'Get code failed'); setRemainTime(0); _remainTime.current = 0; + } finally { + onAfterGetCode?.(); } }; diff --git a/frontend/desktop/src/components/signin/index.tsx b/frontend/desktop/src/components/signin/index.tsx index b8357818ccc..1abb7202706 100644 --- a/frontend/desktop/src/components/signin/index.tsx +++ b/frontend/desktop/src/components/signin/index.tsx @@ -24,8 +24,9 @@ import { debounce } from 'lodash'; import { useTranslation } from 'next-i18next'; import Head from 'next/head'; import { useRouter } from 'next/router'; -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import useWechat from './auth/useWechat'; +import { Turnstile, TurnstileInstance } from '@marsidev/react-turnstile'; export default function SigninComponent() { const { data: platformEnv } = useQuery(['getPlatformEnv'], getSystemEnv); @@ -37,7 +38,8 @@ export default function SigninComponent() { private_protocol_en = '', needPassword = false, needSms = false, - openWechatEnabled = false + openWechatEnabled = false, + cf_sitekey } = platformEnv?.data || {}; const needTabs = needPassword && needSms; const disclosure = useDisclosure(); @@ -80,12 +82,21 @@ export default function SigninComponent() { setToken(''); } }, []); - + const turnstileRef = useRef(null); const loginConfig = useMemo(() => { return { [LoginType.SMS]: { login: smsSubmit, - component: + component: ( + { + turnstileRef.current?.reset(); + }} + getCfToken={() => { + return turnstileRef.current?.getResponse(); + }} + /> + ) }, [LoginType.PASSWORD]: { login: passwordSubmit, @@ -97,7 +108,15 @@ export default function SigninComponent() { }, [LoginType.NONE]: null }; - }, [PasswordComponent, SmsModal, WechatComponent, passwordSubmit, smsSubmit, wechatSubmit]); + }, [ + PasswordComponent, + SmsModal, + WechatComponent, + passwordSubmit, + smsSubmit, + wechatSubmit, + turnstileRef.current + ]); useEffect(() => { setTabIndex(needSms ? LoginType.SMS : needPassword ? LoginType.PASSWORD : LoginType.NONE); @@ -206,6 +225,15 @@ export default function SigninComponent() { {tabIndex !== LoginType.WeChat && ( <> + {!!cf_sitekey && ( + + )}