From 0b9cfbcd2ddfd504951d92cb639e65a67ca10a5f Mon Sep 17 00:00:00 2001 From: Lorenz Hohermuth Date: Fri, 6 Jun 2025 10:26:34 +0200 Subject: [PATCH] added captcha --- .../controller/RecaptchaController.java | 4 ++++ .../src/comunication/FetchUser.js | 24 +++++++++++++++++++ .../src/pages/user/LoginUser.js | 23 +++++++++++++++--- 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 183_12_1_tresorbackend_rupe-master/src/main/java/ch/bbw/pr/tresorbackend/controller/RecaptchaController.java diff --git a/183_12_1_tresorbackend_rupe-master/src/main/java/ch/bbw/pr/tresorbackend/controller/RecaptchaController.java b/183_12_1_tresorbackend_rupe-master/src/main/java/ch/bbw/pr/tresorbackend/controller/RecaptchaController.java new file mode 100644 index 0000000..4e84d0e --- /dev/null +++ b/183_12_1_tresorbackend_rupe-master/src/main/java/ch/bbw/pr/tresorbackend/controller/RecaptchaController.java @@ -0,0 +1,4 @@ +package ch.bbw.pr.tresorbackend.controller; + +public class RecaptchaController { +} diff --git a/183_12_2_tresorfrontend_rupe-master/src/comunication/FetchUser.js b/183_12_2_tresorfrontend_rupe-master/src/comunication/FetchUser.js index ddce577..5f6ff2a 100644 --- a/183_12_2_tresorfrontend_rupe-master/src/comunication/FetchUser.js +++ b/183_12_2_tresorfrontend_rupe-master/src/comunication/FetchUser.js @@ -103,3 +103,27 @@ export const loginUser = async (loginValue) => { throw new Error('Failed to log in. ' || error.message); } } + + +export const captchaCheck = async (captchaToken) => { + const protocol = process.env.REACT_APP_API_PROTOCOL; // "http" + const host = process.env.REACT_APP_API_HOST; // "localhost" + const port = process.env.REACT_APP_API_PORT; // "8080" + const path = process.env.REACT_APP_API_PATH; // "/api" + const portPart = port ? `:${port}` : ''; // port is optional + const API_URL = `${protocol}://${host}${portPart}${path}`; + + try { + + const res = await fetch(`${API_URL}/verify-recaptcha`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ captchaToken }), + }); + + return await res.json(); + } catch (error) { + console.error('Failed to log in:', error.message); + throw new Error('Failed to log in. ' || error.message); + } +} diff --git a/183_12_2_tresorfrontend_rupe-master/src/pages/user/LoginUser.js b/183_12_2_tresorfrontend_rupe-master/src/pages/user/LoginUser.js index fb5c1f1..f48b51e 100644 --- a/183_12_2_tresorfrontend_rupe-master/src/pages/user/LoginUser.js +++ b/183_12_2_tresorfrontend_rupe-master/src/pages/user/LoginUser.js @@ -1,5 +1,7 @@ +import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { loginUser } from '../../comunication/FetchUser'; +import { loginUser, captchaCheck } from '../../comunication/FetchUser'; +import ReCAPTCHA from 'react-google-recaptcha'; /** * LoginUser @@ -7,15 +9,26 @@ import { loginUser } from '../../comunication/FetchUser'; */ function LoginUser({ loginValues, setLoginValues }) { const navigate = useNavigate(); + const [recaptchaToken, setRecaptchaToken] = useState(null); + + const handleCaptcha = (token) => { + setRecaptchaToken(token); + }; const handleSubmit = async (e) => { e.preventDefault(); + if (!recaptchaToken) { + alert("Please verify reCAPTCHA"); + return; + } + try { + const captchaData = await captchaCheck(recaptchaToken); + let isLoginValid = false isLoginValid = await loginUser(loginValues); - console.log(loginValues); - if (isLoginValid) { + if (isLoginValid || captchaData.success) { setLoginValues({ userName: loginValues.email, password: loginValues.password }); navigate('/'); } @@ -54,6 +67,10 @@ function LoginUser({ loginValues, setLoginValues }) { +