diff --git a/client/package-lock.json b/client/package-lock.json
index 4be8ad4..a335784 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -13,6 +13,7 @@
"@testing-library/user-event": "^13.5.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
+ "react-google-recaptcha": "^3.1.0",
"react-icons": "^4.10.1",
"react-loader-spinner": "^5.3.4",
"react-location": "^3.3.4",
@@ -13183,6 +13184,18 @@
"node": ">=14"
}
},
+ "node_modules/react-async-script": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/react-async-script/-/react-async-script-1.2.0.tgz",
+ "integrity": "sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==",
+ "dependencies": {
+ "hoist-non-react-statics": "^3.3.0",
+ "prop-types": "^15.5.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.4.1"
+ }
+ },
"node_modules/react-dev-utils": {
"version": "12.0.0",
"resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz",
@@ -13318,6 +13331,18 @@
"resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz",
"integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA=="
},
+ "node_modules/react-google-recaptcha": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/react-google-recaptcha/-/react-google-recaptcha-3.1.0.tgz",
+ "integrity": "sha512-cYW2/DWas8nEKZGD7SCu9BSuVz8iOcOLHChHyi7upUuVhkpkhYG/6N3KDiTQ3XAiZ2UAZkfvYKMfAHOzBOcGEg==",
+ "dependencies": {
+ "prop-types": "^15.5.0",
+ "react-async-script": "^1.2.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.4.1"
+ }
+ },
"node_modules/react-icons": {
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz",
diff --git a/client/package.json b/client/package.json
index 270a626..fc6a3bc 100644
--- a/client/package.json
+++ b/client/package.json
@@ -8,6 +8,7 @@
"@testing-library/user-event": "^13.5.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
+ "react-google-recaptcha": "^3.1.0",
"react-icons": "^4.10.1",
"react-loader-spinner": "^5.3.4",
"react-location": "^3.3.4",
diff --git a/client/src/pages/SignUp/SignUp.js b/client/src/pages/SignUp/SignUp.js
index 9275779..b0f4996 100644
--- a/client/src/pages/SignUp/SignUp.js
+++ b/client/src/pages/SignUp/SignUp.js
@@ -5,14 +5,15 @@ import { useNavigate } from 'react-router-dom'
import { FaUserAlt } from 'react-icons/fa'
import { MdEmail, MdPassword } from 'react-icons/md'
import { AiFillEyeInvisible, AiFillEye, AiFillGoogleCircle, AiFillFacebook } from 'react-icons/ai'
+import ReCAPTCHA from "react-google-recaptcha"
export default function SignUp() {
- const [details, setDetails] = React.useState({ name: '', email: '', password: '', confirmPassword: '' })
+ const [details, setDetails] = React.useState({ name: '', email: '', password: '', confirmPassword: '', Token: '' })
const navigate = useNavigate()
const handleSignUp = async (e) => {
e.preventDefault()
- const { name, email, password } = details
- const user = { name, email, password }
+ const { name, email, password, Token } = details
+ const user = { name, email, password, Token }
try {
if (password !== details.confirmPassword) {
alert('Passwords do not match')
@@ -56,6 +57,8 @@ export default function SignUp() {
}
}
+ const reRef = React.createRef(null);
+
return (
<>
@@ -64,6 +67,7 @@ export default function SignUp() {
{/* Login Actual Div */}
+
+ setDetails({ ...details, Token: token })}
+ sitekey="Your client site key"
+ />
+
{/* Form Buttons */}
@@ -176,6 +185,8 @@ export default function SignUp() {
+
+
diff --git a/server/api/controller/reset.js b/server/api/controller/reset.js
index a29668c..4e4a50d 100644
--- a/server/api/controller/reset.js
+++ b/server/api/controller/reset.js
@@ -4,7 +4,7 @@ const { decodePassword, encodePassword } = require('../Authentication/passwordEn
const User = require('../models/doctor');
const { resetToken } = require('../Authentication/jwt');
const { resetEmail } = require('../Authentication/template');
-const { transporter } = require('../Authentication/transportmail');
+
const changePassword = async (req, res) => {
try {
diff --git a/server/api/controller/user.js b/server/api/controller/user.js
index 25551ea..9825a92 100644
--- a/server/api/controller/user.js
+++ b/server/api/controller/user.js
@@ -2,20 +2,35 @@ const User = require('../models/user');
const { encodePassword, decodePassword } = require('../Authentication/passwordEncodeDecode');
const { userLoginSchema, userRegisterSchema, userUpdateSchema } = require('../validations/user');
const { tokenSign } = require('../Authentication/jwt');
+const axios = require('axios');
// SIGNUP-CONTROLLER
const registerUser = async (req, res) => {
try {
- const payloadValidate = await userRegisterSchema.validateAsync(req.body);
- const { name, email, password } = payloadValidate;
- const hashPassword = await encodePassword(password);
- const user = new User({
- name,
- email,
- password: hashPassword
+ const payloadValidate = await userRegisterSchema.validateAsync({
+ name: req.body.name,
+ email: req.body.email,
+ password: req.body.password
});
- await user.save();
- res.status(201).json({ name, email });
+ const { name, email, password } = payloadValidate;
+ //Captcha Verification
+ const secret = "YOUR SECRET KEY";
+ const url = `https://www.google.com/recaptcha/api/siteverify?secret=${secret}&response=${req.body.Token}`;
+ const response = await axios.post(url);
+ if (response.data.success) {
+
+ const hashPassword = await encodePassword(password);
+ const user = new User({
+ name,
+ email,
+ password: hashPassword
+ });
+ await user.save();
+ res.status(201).json({ name, email });
+ }
+ else {
+ res.status(400).json({ message: 'Invalid Captcha' });
+ }
} catch (e) {
res.status(400).json({ message: e.message });
}
diff --git a/server/api/routes/user.js b/server/api/routes/user.js
index b3c082f..652ee8b 100644
--- a/server/api/routes/user.js
+++ b/server/api/routes/user.js
@@ -3,9 +3,9 @@ const router = express.Router();
const { loginUser, registerUser, updateUser } = require('../controller/user');
const { tokenVerify } = require('../Authentication/jwt');
+
// SIGNUP-ENDPOINT
router.post('/userSignUp', registerUser);
-
// LOGIN-ENDPOINT
router.post('/userLogin', loginUser);
diff --git a/server/package-lock.json b/server/package-lock.json
index fa15769..588e445 100644
--- a/server/package-lock.json
+++ b/server/package-lock.json
@@ -9,6 +9,7 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
+ "axios": "^1.4.0",
"bcryptjs": "^2.4.3",
"concurrently": "^7.0.0",
"cors": "^2.8.5",
@@ -1882,6 +1883,11 @@
"get-intrinsic": "^1.1.3"
}
},
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
"node_modules/available-typed-arrays": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
@@ -1893,6 +1899,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/axios": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+ "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2172,6 +2188,17 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2324,6 +2351,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -3156,6 +3191,25 @@
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
},
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
"node_modules/for-each": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
@@ -3164,6 +3218,19 @@
"is-callable": "^1.1.3"
}
},
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -4442,6 +4509,11 @@
"node": ">= 0.10"
}
},
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
"node_modules/pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
diff --git a/server/package.json b/server/package.json
index 6f21265..7850733 100644
--- a/server/package.json
+++ b/server/package.json
@@ -23,6 +23,7 @@
"nodemon": "^2.0.15"
},
"dependencies": {
+ "axios": "^1.4.0",
"bcryptjs": "^2.4.3",
"concurrently": "^7.0.0",
"cors": "^2.8.5",