From f73e19b9255b91decc0f404afa8c3198e4c9742b Mon Sep 17 00:00:00 2001 From: Gupta Date: Mon, 6 Jan 2025 01:11:29 +0530 Subject: [PATCH] anupam/v2/google --- client/src/pages/Login.jsx | 39 ++++- client/utils/firebase.js | 64 ++++++-- server/.env | 12 +- server/controllers/authController.js | 210 +++++++++++++++++---------- server/index.js | 4 +- 5 files changed, 230 insertions(+), 99 deletions(-) diff --git a/client/src/pages/Login.jsx b/client/src/pages/Login.jsx index 36be880..3f1648b 100644 --- a/client/src/pages/Login.jsx +++ b/client/src/pages/Login.jsx @@ -21,17 +21,42 @@ export default function SignInThree() { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); + // async function handleGoogleSignIn() { + // try { + // const userdata = await googleAuth(); + // console.log(userdata); + // const idToken = userdata.getIdToken(); + // console.log(idToken); + + // const res = await axios.post( + // `${import.meta.env.VITE_API_URL}/api/login`, + // { + // accessToken: idToken, + // } + // ); + + // if (res.data.success) { + // toast.success(res.data.message); + // dispatch(login(res.data)); + // navigate(`/${res.data.role}/profile`); + // } + // } catch (error) { + // toast.error(error.response?.data?.message || "Google login failed."); + // console.error(error); + // } + // } + + async function handleGoogleSignIn() { try { - const data = await googleAuth(); - const googleToken = data.accessToken; - console.log(googleToken); - + let userdata = await googleAuth(); + const idToken = await userdata.getIdToken(); + const res = await axios.post( `${import.meta.env.VITE_API_URL}/api/login`, - {googleToken } + { accessToken: idToken } ); - + if (res.data.success) { toast.success(res.data.message); dispatch(login(res.data)); @@ -39,9 +64,9 @@ export default function SignInThree() { } } catch (error) { toast.error(error.response?.data?.message || "Google login failed."); - console.error(error); } } + const handleSubmit = async (e) => { e.preventDefault(); diff --git a/client/utils/firebase.js b/client/utils/firebase.js index e62ae87..c692c20 100644 --- a/client/utils/firebase.js +++ b/client/utils/firebase.js @@ -1,14 +1,44 @@ -// Import the functions you need from the SDKs you need -import { initializeApp } from "firebase/app"; -import { getAuth,GoogleAuthProvider, signInWithPopup } from "firebase/auth"; +// // Import the functions you need from the SDKs you need +// import { initializeApp } from "firebase/app"; +// import { getAuth, GoogleAuthProvider, signInWithPopup } from "firebase/auth"; + +// // TODO: Add SDKs for Firebase products that you want to use +// // https://firebase.google.com/docs/web/setup#available-libraries + +// // For Firebase JS SDK v7.20.0 and later, measurementId is optional + +// const firebaseConfig = { +// apiKey: import.meta.env.VITE_APIKEY, +// authDomain: import.meta.env.VITE_AUTHDOMAIN, +// projectId: import.meta.env.VITE_PROJECTID, +// storageBucket: import.meta.env.VITE_STORAGEBUCKET, +// messagingSenderId: import.meta.env.VITE_MESSAGINGSENDERID, +// appId: import.meta.env.VITE_APPID, +// measurementId: import.meta.env.VITE_MES, +// }; + +// const app = initializeApp(firebaseConfig); + +// const auth = getAuth(app); + +// const provider = new GoogleAuthProvider(); +// export default async function googleAuth() { +// try { +// let data = await signInWithPopup(auth, provider); +// return data.user; +// } catch (err) { +// console.log(err); +// } +// } -// TODO: Add SDKs for Firebase products that you want to use -// https://firebase.google.com/docs/web/setup#available-libraries -// For Firebase JS SDK v7.20.0 and later, measurementId is optional +// Import the functions you need from the SDKs +import { initializeApp } from "firebase/app"; +import { getAuth, GoogleAuthProvider, signInWithPopup } from "firebase/auth"; +// Firebase configuration using environment variables const firebaseConfig = { apiKey: import.meta.env.VITE_APIKEY, authDomain: import.meta.env.VITE_AUTHDOMAIN, @@ -19,22 +49,26 @@ const firebaseConfig = { measurementId: import.meta.env.VITE_MES, }; - - - +// Initialize Firebase app const app = initializeApp(firebaseConfig); +// Initialize Firebase Authentication and Google Provider const auth = getAuth(app); - const provider = new GoogleAuthProvider(); - +provider.setCustomParameters({ + prompt: "select_account", // Forces user to select an account every time +}); + +// Export the Google Authentication function export default async function googleAuth() { try { - let data = await signInWithPopup(auth, provider); - return data.user; + const data = await signInWithPopup(auth, provider); + return data.user; // Returns the authenticated user object } catch (err) { - console.log(err); - + console.error("Error during Google authentication:", err.message); + throw err; // Optional: re-throw the error for further handling } } +// Optionally export the app and auth for reuse +export { app, auth, provider }; diff --git a/server/.env b/server/.env index d0ab26e..5948eda 100644 --- a/server/.env +++ b/server/.env @@ -11,5 +11,15 @@ EMAIL_PASSWORD= CLIENT_URL=http://localhost:5173 - +FIREBASE_TYPE =service_account +FIREBASE_PROJECT_ID =picwebsite-f72d2 +FIREBASE_PRIVATE_KEY_ID ="e1e04a54227f38b54b1819686899c7a9cfb7c7b9" +FIREBASE_PRIVATE_KEY ="-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDILWhQW5u5UhiK\nss6xkwxvJYSu88icmoiXOHZQ6U009dVNbSseWJi7Xyh1ACNQK6zGczcpita+EKfJ\nfU1pa45xBLAG0VRcRdEbq1x2KER1YFuoP5xHKRJJi1WhWS8r4HVnZ+z2Bre9oSWl\nLrKF5B1wsPrL6j+TiDi+qM2MK+KL0z70eh4w1aqgnKBzwvp1E5N1XsAAUGFtDSjA\nTLV9PkSuP2/NOve9fMsC9TQI3E7c3lsiZZU8xikdtG8Y7yGW+w4TWDlQpv3uys3C\nXx/DdLpHBZaD6voFNZTa2IdxGMOGbFjYP/sQQhrEehYCy6FZjnL/5ot2z8eWVqDm\n/DmhnNNrAgMBAAECggEANirDXWtMmjsy1OVJtRd7d+AJJWZmVKokZ/cpXP+kmr4i\n+A6galfDDIDVa8Obyqfm2tR2itE9BrVvEcDMX8hxBPglwdKHJ2jlCr22CWsgCzsF\n0mNUIJVmk2wWwdBmSVM1scOXhYOP2Mpwa2BVgpGVvdbGJsO+bGeiI0V+SX3ekcMf\nXBoDXpdnG2RkzgMHvFhBg1q+FZn3+yGdwXzIkPk3N11M+hQpTSYypxZCgLbt4/v6\nQDC9XtxGZqgsVllHs/rzJQyfbtw+qWuhDMxpUsaSQYPI2ozajQzosrSoEIkABZSa\nJP5m1F7DeZ58svTOvzMR7WM27LDdSi4dciVd5xRNcQKBgQDre6yR++OU58INFSpC\n/G9sPzmpHvpLTDVOP8PxjSM/gZ5HeDeZIhAjseAMF1zE8n7AzRJJKyqHEoU+8ePb\nCVlko1sFaSFzVAd0Lm3dpg6R98xjsEmOA1/7uqhZyCkqWzfFjTJUUWOnmY5gi6UA\nQW1z+vy1Beh0/FlKGF9hmF6thwKBgQDZnkH+ENEW7FaS/QO+16f3WU5iFZ798oLJ\nVjOQ5bcQ1HMh0PC6T8oVU2/Yl223bprfMD2XqLlwSQv62VQd2w3piANfy8CW91k2\nhbAYLUeY0aIyiHu6rqofNWry49iyDBopi0//6tEOUL4PHkOP+T1NbS3pRC9xZFOr\nR7cWRpdD/QKBgGdtpalk+lufw5Kddjd/yqy/xGKs0YCbE1qwFS8WL6IoG04G1lyz\nImWbLe4BoOR8IgIq0FpE1GQJVW8FLXA6VgIm4capm2CdSrzT27ubwRCJx0MN3fC7\nOMBHBsSQbsxEzmU9lBqGuP+XKXrsOue21Q048x/LXYNshwdNVy91jjgnAoGAOCWh\n5zhVijGOILyRE9M2bhYnqBzl+aVxYxsPkOoD8p6t2eK7yYY+oIP3jo17bGFoKf+b\nVJ7ewX7HTYB3OIDFNSS3oibC2PCWnv+dMI+2MlKcI6edLMxV7lls76Ajz8RZl7Bv\nApuGNshUUThAvEvVKj3qI45JI1t8Tuvg7Cloa80CgYEAw+BORwBDkq3YBNB1nKsF\nDYfcUgUFurzht16pGOWg+YjN52x1YCmbbwa+WorCLIGuE6Kc/KEsp9cLdVYz/rCG\neQAeUF92g8VBOZrOc3TmouQ5a/Kfckdc2toufi3w/gCdOpT2876GOxXqhpD7gUkF\nzku7DMolGUgNoIfnMkutUeM=\n-----END PRIVATE KEY-----\n" +FIREBASE_CLIENT_EMAIL ="firebase-adminsdk-4xgs4@picwebsite-f72d2.iam.gserviceaccount.com" +FIREBASE_CLIENT_ID ="103337786084546895503" +FIREBASE_AUTH_URI ="https://accounts.google.com/o/oauth2/auth" +FIREBASE_TOKEN_URI ="https://oauth2.googleapis.com/token" +FIREBASE_AUTH_PROVIDER_X509_CERT_URL ="https://www.googleapis.com/oauth2/v1/certs" +FIREBASE_CLIENT_X509_CERT_URL ="https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-4xgs4%40picwebsite-f72d2.iam.gserviceaccount.com" +FIREBASE_UNIVERSAL_DOMAIN ="googleapis.com" diff --git a/server/controllers/authController.js b/server/controllers/authController.js index 0d47bc1..c9ce49a 100644 --- a/server/controllers/authController.js +++ b/server/controllers/authController.js @@ -24,22 +24,7 @@ admin.initializeApp({ }), }); -// admin.initializeApp({ -// credential: admin.credential.cert({ -// "type": "service_account", -// "project_id": "picwebsite-f72d2", -// "private_key_id": "e1e04a54227f38b54b1819686899c7a9cfb7c7b9", -// "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDILWhQW5u5UhiK\nss6xkwxvJYSu88icmoiXOHZQ6U009dVNbSseWJi7Xyh1ACNQK6zGczcpita+EKfJ\nfU1pa45xBLAG0VRcRdEbq1x2KER1YFuoP5xHKRJJi1WhWS8r4HVnZ+z2Bre9oSWl\nLrKF5B1wsPrL6j+TiDi+qM2MK+KL0z70eh4w1aqgnKBzwvp1E5N1XsAAUGFtDSjA\nTLV9PkSuP2/NOve9fMsC9TQI3E7c3lsiZZU8xikdtG8Y7yGW+w4TWDlQpv3uys3C\nXx/DdLpHBZaD6voFNZTa2IdxGMOGbFjYP/sQQhrEehYCy6FZjnL/5ot2z8eWVqDm\n/DmhnNNrAgMBAAECggEANirDXWtMmjsy1OVJtRd7d+AJJWZmVKokZ/cpXP+kmr4i\n+A6galfDDIDVa8Obyqfm2tR2itE9BrVvEcDMX8hxBPglwdKHJ2jlCr22CWsgCzsF\n0mNUIJVmk2wWwdBmSVM1scOXhYOP2Mpwa2BVgpGVvdbGJsO+bGeiI0V+SX3ekcMf\nXBoDXpdnG2RkzgMHvFhBg1q+FZn3+yGdwXzIkPk3N11M+hQpTSYypxZCgLbt4/v6\nQDC9XtxGZqgsVllHs/rzJQyfbtw+qWuhDMxpUsaSQYPI2ozajQzosrSoEIkABZSa\nJP5m1F7DeZ58svTOvzMR7WM27LDdSi4dciVd5xRNcQKBgQDre6yR++OU58INFSpC\n/G9sPzmpHvpLTDVOP8PxjSM/gZ5HeDeZIhAjseAMF1zE8n7AzRJJKyqHEoU+8ePb\nCVlko1sFaSFzVAd0Lm3dpg6R98xjsEmOA1/7uqhZyCkqWzfFjTJUUWOnmY5gi6UA\nQW1z+vy1Beh0/FlKGF9hmF6thwKBgQDZnkH+ENEW7FaS/QO+16f3WU5iFZ798oLJ\nVjOQ5bcQ1HMh0PC6T8oVU2/Yl223bprfMD2XqLlwSQv62VQd2w3piANfy8CW91k2\nhbAYLUeY0aIyiHu6rqofNWry49iyDBopi0//6tEOUL4PHkOP+T1NbS3pRC9xZFOr\nR7cWRpdD/QKBgGdtpalk+lufw5Kddjd/yqy/xGKs0YCbE1qwFS8WL6IoG04G1lyz\nImWbLe4BoOR8IgIq0FpE1GQJVW8FLXA6VgIm4capm2CdSrzT27ubwRCJx0MN3fC7\nOMBHBsSQbsxEzmU9lBqGuP+XKXrsOue21Q048x/LXYNshwdNVy91jjgnAoGAOCWh\n5zhVijGOILyRE9M2bhYnqBzl+aVxYxsPkOoD8p6t2eK7yYY+oIP3jo17bGFoKf+b\nVJ7ewX7HTYB3OIDFNSS3oibC2PCWnv+dMI+2MlKcI6edLMxV7lls76Ajz8RZl7Bv\nApuGNshUUThAvEvVKj3qI45JI1t8Tuvg7Cloa80CgYEAw+BORwBDkq3YBNB1nKsF\nDYfcUgUFurzht16pGOWg+YjN52x1YCmbbwa+WorCLIGuE6Kc/KEsp9cLdVYz/rCG\neQAeUF92g8VBOZrOc3TmouQ5a/Kfckdc2toufi3w/gCdOpT2876GOxXqhpD7gUkF\nzku7DMolGUgNoIfnMkutUeM=\n-----END PRIVATE KEY-----\n", -// "client_email": "firebase-adminsdk-4xgs4@picwebsite-f72d2.iam.gserviceaccount.com", -// "client_id": "103337786084546895503", -// "auth_uri": "https://accounts.google.com/o/oauth2/auth", -// "token_uri": "https://oauth2.googleapis.com/token", -// "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", -// "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-4xgs4%40picwebsite-f72d2.iam.gserviceaccount.com", -// "universe_domain": "googleapis.com" -// } -// ) -// }); + // const signup = async (req, res) => { @@ -158,64 +143,20 @@ const verifyEmail = async (req, res) => { } }; - - - - -// const login = async (req, res) => { -// const { email, password } = req.body; -// try { -// let user = await User.findOne({ email }); -// if (!user) { -// return res.status(400).json({ success: false, message: "Please signup" }); -// } -// if (!user.verify) { -// return res.status(400).json({ success: false, message: "Please verify your email" }); -// } -// const comparePassword = await bcrypt.compare(password, user.password); -// if (!comparePassword) -// return res -// .status(400) -// .json({ success: false, message: "Invalid credentails" }); - -// const data = { -// id: user._id, -// accountType: user.accountType, -// author: user.username, -// }; - -// const accessToken = generateAccessToken(data); -// const refreshToken = generateRefreshToken(data); - -// return res.status(200).json({ -// success: true, -// message: "Login successful", -// accessToken, -// refreshToken, -// role: user.accountType, -// author: user.username, -// }); -// } catch (error) { -// return res.status(500).json({ success: false, message: error.message }); -// } -// }; - - - const login = async (req, res) => { - const { email, password, googleToken } = req.body; - + const { email, password } = req.body; try { - if (googleToken) { - // Verify Google token - const decodedToken = await admin.auth().verifyIdToken(googleToken); + // Handle Google login if accessToken is present + if (req.body.accessToken) { + const { accessToken } = req.body; // Access token is declared here + + const decodedToken = await admin.auth().verifyIdToken(accessToken); const userEmail = decodedToken.email; let user = await User.findOne({ email: userEmail }); - + if (!user) { - // Register new user for Google Login user = new User({ username: decodedToken.name || "GoogleUser", email: userEmail, @@ -225,28 +166,27 @@ const login = async (req, res) => { await user.save(); } - // Generate JWT tokens const data = { id: user._id, accountType: user.accountType, author: user.username, }; - const accessToken = generateAccessToken(data); + const newaccessToken = generateAccessToken(data); const refreshToken = generateRefreshToken(data); return res.status(200).json({ success: true, message: "Login successful", - accessToken, + newaccessToken, refreshToken, role: user.accountType, author: user.username, verify: true, - verifyToken:null, + verifyToken: null, }); } - // Fallback for traditional Email/Password login + // Traditional Email/Password login let user = await User.findOne({ email }); if (!user) { return res.status(400).json({ success: false, message: "Please signup" }); @@ -264,13 +204,13 @@ const login = async (req, res) => { accountType: user.accountType, author: user.username, }; - const accessToken = generateAccessToken(data); + const newaccessToken = generateAccessToken(data); const refreshToken = generateRefreshToken(data); return res.status(200).json({ success: true, message: "Login successful", - accessToken, + newaccessToken, refreshToken, role: user.accountType, author: user.username, @@ -280,6 +220,128 @@ const login = async (req, res) => { } }; + + + +// const login = async (req, res) => { +// const { email, password } = req.body; +// try { +// let user = await User.findOne({ email }); +// if (!user) { +// return res.status(400).json({ success: false, message: "Please signup" }); +// } +// if (!user.verify) { +// return res.status(400).json({ success: false, message: "Please verify your email" }); +// } +// const comparePassword = await bcrypt.compare(password, user.password); +// if (!comparePassword) +// return res +// .status(400) +// .json({ success: false, message: "Invalid credentails" }); + +// const data = { +// id: user._id, +// accountType: user.accountType, +// author: user.username, +// }; + +// const accessToken = generateAccessToken(data); +// const refreshToken = generateRefreshToken(data); + +// return res.status(200).json({ +// success: true, +// message: "Login successful", +// accessToken, +// refreshToken, +// role: user.accountType, +// author: user.username, +// }); +// } catch (error) { +// return res.status(500).json({ success: false, message: error.message }); +// } +// }; + + + +// const login = async (req, res) => { +// const { email, password, accessToken} = req.body; + + +// try { +// if (accessToken){ +// // Verify Google token +// console.log("Received accessToken:", accessToken); +// const decodedToken = await admin.auth().verifyIdToken(accessToken); +// const userEmail = decodedToken.email; + +// let user = await User.findOne({ email: userEmail }); + +// if (!user) { +// // Register new user for Google Login +// user = new User({ +// username: decodedToken.name || "GoogleUser", +// email: userEmail, +// accountType: "buyer", // Default to buyer for Google logins +// verify: true, // Automatically verified for Google users +// }); +// await user.save(); +// } + +// // Generate JWT tokens +// const data = { +// id: user._id, +// accountType: user.accountType, +// author: user.username, +// }; +// const accessToken = generateAccessToken(data); +// const refreshToken = generateRefreshToken(data); + +// return res.status(200).json({ +// success: true, +// message: "Login successful", +// accessToken, +// refreshToken, +// role: user.accountType, +// author: user.username, +// verify: true, +// verifyToken:null, +// }); +// } + +// // Fallback for traditional Email/Password login +// let user = await User.findOne({ email }); +// if (!user) { +// return res.status(400).json({ success: false, message: "Please signup" }); +// } +// if (!user.verify) { +// return res.status(400).json({ success: false, message: "Please verify your email" }); +// } +// const comparePassword = await bcrypt.compare(password, user.password); +// if (!comparePassword) { +// return res.status(400).json({ success: false, message: "Invalid credentials" }); +// } + +// const data = { +// id: user._id, +// accountType: user.accountType, +// author: user.username, +// }; +// const accessToken = generateAccessToken(data); +// const refreshToken = generateRefreshToken(data); + +// return res.status(200).json({ +// success: true, +// message: "Login successful", +// accessToken, +// refreshToken, +// role: user.accountType, +// author: user.username, +// }); +// } catch (error) { +// return res.status(500).json({ success: false, message: error.message }); +// } +// }; + const refresh = async (req, res) => { const authHeader = req.headers["authorization"]; diff --git a/server/index.js b/server/index.js index 1329056..fe60ab9 100644 --- a/server/index.js +++ b/server/index.js @@ -42,8 +42,8 @@ app.use(express.json()); app.use(cors({ - // origin: 'https://pic-prism-my.vercel.app', - origin: 'http://localhost:5173', + origin: 'https://pic-prism-my.vercel.app', + // origin: 'http://localhost:5173', credentials: true, }));