**this is my app.js code: **
import dotenv from "dotenv";
import express from "express";
import bodyParser from "body-parser";
import ejs from "ejs";
import mongoose from "mongoose";
import session from "express-session";
import passport from "passport";
import passportLocalMongoose from "passport-local-mongoose";
import { Strategy as GoogleStrategy } from "passport-google-oauth20";
dotenv.config();
const app = express();
const PORT = process.env.PORT || 3000;
app.use(express.static("public"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
app.use(session({
secret: "our little secret.",
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
mongoose.connect('mongodb://127.0.0.1:27017/UserDB', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log("Connected to MongoDB"))
.catch(error => console.error("MongoDB connection error:", error));
const userSchema = new mongoose.Schema({
email: String,
password: String,
googleId: String,
secret: String
});
userSchema.plugin(passportLocalMongoose);
const User = mongoose.model("User", userSchema);
passport.use(User.createStrategy());
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
passport.use(new GoogleStrategy({
clientID: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
callbackURL: "http://localhost:3000/auth/google/Secrets",
userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
}, (accessToken, refreshToken, profile, done) => {
return done(null, profile);
}));
app.get("/", (req, res) => {
res.render("home.ejs");
});
app.get("/login", (req, res) => {
res.render("login.ejs")
});
app.get("/register", (req, res) => {
res.render("register.ejs")
});
app.get("/secrets", (req, res) => {
if (req.user) { // Check if there's a user in the session
User.find({ secret: { $ne: null } })
.then(foundUsers => {
res.render("secrets.ejs", { usersWithSecrets: foundUsers });
})
.catch(err => {
console.log("Error finding users with secrets", err);
res.redirect("/login");
});
} else {
res.redirect("/login");
}
});
app.get("/logout", (req, res) => {
req.logout(function (err) {
if (err) {
console.log("Error logging out", err);
res.redirect("/");
} else {
res.redirect("/");
}
});
});
// Route for Google OAuth login
app.get("/auth/google", passport.authenticate("google", { scope: ["profile"] }));
// Callback URL after Google has authenticated the user
app.get("/auth/google/Secrets",
passport.authenticate("google", { failureRedirect: "/login" }),
(req, res) => {
// Successful authentication, redirect to a page or perform other actions.
passport.authenticate("local")(req, res, () => {
res.redirect("/secrets");
});
}
);
app.post("/register", (req, res) => {
try {
const user = new User({
username: req.body.username,
});
User.register(user, req.body.password, (error, registeredUser) => {
if (error) {
console.log("Problem registering a new user", error);
res.send("<h3>Failed to register you!!</h3>");
} else {
passport.authenticate("local")(req, res, () => {
res.redirect("/secrets");
});
}
});
} catch (error) {
console.log(`Problem registering a new user ${error}`);
res.send("<h3>Failed to register you!!</h3>");
}
});
app.post("/login", async (req, res) => {
try {
const user = new User({
username: req.body.username,
password: req.body.password
})
req.login(user, function (err) {
if (err) {
console.log("Problem logging in the user", error);
res.send("<h3>Failed to login!!</h3>");
} else {
passport.authenticate("local")(req, res, () => {
res.redirect("/secrets");
})
}
})
} catch (error) {
console.log(`Problem logging in a user ${error}`);
res.send("Failed to Login!!");
}
})
app.listen(PORT, () => {
console.log(`Server started on port ${PORT}.`);
});
please, a brief answer with solution code will be much appreciated. thanks in advance
I tried comparing my OAuth 2.0 credentials with my code and everything seems perfect. It's really frustrating cause I have been on this for days.