diff --git a/client/src/pages/BrowseCategory.jsx b/client/src/pages/BrowseCategory.jsx
index 97abf1e..1ecbba5 100644
--- a/client/src/pages/BrowseCategory.jsx
+++ b/client/src/pages/BrowseCategory.jsx
@@ -6,13 +6,13 @@ export default function BrowseCategory() {
useEffect(() => {
// Set the card data when the component mounts
- setCards(browseData);
+ setCards(browseData);
}, []);
return (
- Browse Category
+ Browse Category more this
{cards.map((card, index) => (
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,
}));