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 */}
+

Doctor Verse

{/* username */} @@ -155,6 +159,11 @@ export default function SignUp() { }
+ 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",