feat: refresh captcha correctly (#8491)

fix AF-1482
This commit is contained in:
darkskygit
2024-10-15 09:10:28 +00:00
parent 3d3a66c3ed
commit 13b24eb823
4 changed files with 32 additions and 11 deletions

View File

@@ -25,7 +25,7 @@ export const SignInWithPassword: FC<AuthPanelProps<'signInWithPassword'>> = ({
const [password, setPassword] = useState(''); const [password, setPassword] = useState('');
const [passwordError, setPasswordError] = useState(false); const [passwordError, setPasswordError] = useState(false);
const [verifyToken, challenge] = useCaptcha(); const [verifyToken, challenge, refreshChallenge] = useCaptcha();
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const [sendingEmail, setSendingEmail] = useState(false); const [sendingEmail, setSendingEmail] = useState(false);
@@ -43,10 +43,19 @@ export const SignInWithPassword: FC<AuthPanelProps<'signInWithPassword'>> = ({
} catch (err) { } catch (err) {
console.error(err); console.error(err);
setPasswordError(true); setPasswordError(true);
refreshChallenge?.();
} finally { } finally {
setIsLoading(false); setIsLoading(false);
} }
}, [isLoading, authService, email, password, verifyToken, challenge]); }, [
isLoading,
verifyToken,
authService,
email,
password,
challenge,
refreshChallenge,
]);
const sendMagicLink = useAsyncCallback(async () => { const sendMagicLink = useAsyncCallback(async () => {
if (sendingEmail) return; if (sendingEmail) return;

View File

@@ -29,7 +29,7 @@ export const SignIn: FC<AuthPanelProps<'signIn'>> = ({
const authService = useService(AuthService); const authService = useService(AuthService);
const [searchParams] = useSearchParams(); const [searchParams] = useSearchParams();
const [isMutating, setIsMutating] = useState(false); const [isMutating, setIsMutating] = useState(false);
const [verifyToken, challenge] = useCaptcha(); const [verifyToken, challenge, refreshChallenge] = useCaptcha();
const [email, setEmail] = useState(''); const [email, setEmail] = useState('');
const [isValidEmail, setIsValidEmail] = useState(true); const [isValidEmail, setIsValidEmail] = useState(true);
@@ -53,6 +53,7 @@ export const SignIn: FC<AuthPanelProps<'signIn'>> = ({
// provider password sign-in if user has by default // provider password sign-in if user has by default
// If with payment, onl support email sign in to avoid redirect to affine app // If with payment, onl support email sign in to avoid redirect to affine app
if (hasPassword) { if (hasPassword) {
refreshChallenge?.();
setAuthState({ setAuthState({
state: 'signInWithPassword', state: 'signInWithPassword',
email, email,
@@ -82,7 +83,14 @@ export const SignIn: FC<AuthPanelProps<'signIn'>> = ({
} }
setIsMutating(false); setIsMutating(false);
}, [authService, challenge, email, setAuthState, verifyToken]); }, [
authService,
challenge,
email,
refreshChallenge,
setAuthState,
verifyToken,
]);
return ( return (
<> <>

View File

@@ -73,15 +73,19 @@ export const Captcha = () => {
); );
}; };
export const useCaptcha = (): [string | undefined, string?] => { export const useCaptcha = (): [string | undefined, string?, (() => void)?] => {
const [verifyToken] = useAtom(captchaAtom); const [verifyToken] = useAtom(captchaAtom);
const [response, setResponse] = useAtom(responseAtom); const [response, setResponse] = useAtom(responseAtom);
const hasCaptchaFeature = useHasCaptcha(); const hasCaptchaFeature = useHasCaptcha();
const { data: challenge } = useSWR('/api/auth/challenge', challengeFetcher, { const { data: challenge, mutate } = useSWR(
'/api/auth/challenge',
challengeFetcher,
{
suspense: false, suspense: false,
revalidateOnFocus: false, revalidateOnFocus: false,
}); }
);
const prevChallenge = useRef(''); const prevChallenge = useRef('');
useEffect(() => { useEffect(() => {
@@ -106,7 +110,7 @@ export const useCaptcha = (): [string | undefined, string?] => {
if (BUILD_CONFIG.isElectron) { if (BUILD_CONFIG.isElectron) {
if (response) { if (response) {
return [response, challenge?.challenge]; return [response, challenge?.challenge, mutate];
} else { } else {
return [undefined, challenge?.challenge]; return [undefined, challenge?.challenge];
} }

View File

@@ -2,7 +2,7 @@
"ar": 87, "ar": 87,
"ca": 6, "ca": 6,
"da": 7, "da": 7,
"de": 33, "de": 32,
"en": 100, "en": 100,
"es-AR": 14, "es-AR": 14,
"es-CL": 16, "es-CL": 16,