Reputation: 50
In express backend I'm using passport.js for social login , Login workflow and other routes are working as expected but req.logout() is not logging user out , I tried many solutions I found online but none of it has worked for me.
I'm using passport version 0.5.3
Here is my code :
logout route in auth.js
routerLogin.post("/logout", (req, res) => {
console.log('user =>', req.user) // undefined
req.logout();
res.send();
});
passport.js
import passport from "passport";
import User from "./models/user.js";
import Google from "passport-google-oauth20";
import Facebook from "passport-facebook";
const FacebookStrategy = Facebook.Strategy;
const GoogleStrategy = Google.Strategy;
import { createRequire } from "module";
const require = createRequire(import.meta.url);
require("dotenv").config();
passport.serializeUser((user, done) => {
done(null, user);
});
passport.deserializeUser((user, done) =>
User.findOne({ GoogleID: user.id })
.then((user) => done(null, user))
.catch(done)
);
passport.use(
new GoogleStrategy(
{
clientID: process.env.GOOGLE_APP_ID,
clientSecret: process.env.GOOGLE_APP_SECRET_KEY,
callbackURL: "http://localhost:8000/auth/google/callback",
},
async function (accessToken, refreshToken, profile, done) {
const id = profile.id;
const name = profile.displayName;
const email = profile.emails[0].value;
const picture = profile.photos[0].value;
const user = await User.findOne({ GoogleID: id });
const userSameEmail = await User.findOne({ email: email });
if (!user && !userSameEmail) {
const user = new User({
GoogleID: id,
name,
email,
picture,
});
await user.save();
}
done(null, profile);
}
)
);
passport.use(
new FacebookStrategy(
{
clientID: process.env.FB_APP_ID,
clientSecret: process.env.FB_APP_SECRET_KEY,
callbackURL: "http://localhost:8000/auth/facebook/callback",
},
async function (accessToken, refreshToken, profile, done) {
const id = profile.id;
const name = profile.name;
const email = profile.emails[0].value;
const userSameEmail = await User.findOne({ email: email });
const user = await User.findOne({ fbID: id });
if (!user && !userSameEmail) {
const user = new User({
fbID: id,
name,
email,
});
await user.save();
}
done(null, profile);
}
)
);
export default passport;
server.js
import express from "express";
import mongoose from "mongoose";
import passport from "./passport.js";
import routerLogin from "./routes/auth.js";
import cookieSession from "cookie-session";
import cors from "cors";
import { createRequire } from "module";
const require = createRequire(import.meta.url);
require("dotenv").config();
const bodyParser = require("body-parser");
const morgan = require("morgan");
const app = express();
app.use(
cors({
origin: "http://localhost:3000",
credentials: true,
methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
})
);
app.use(bodyParser.json());
mongoose
.connect(process.env.DATABASE, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => console.log("DB Connected"))
.catch((err) => console.log("DB Connection Error: ", err));
app.use(morgan("dev"));
app.use(express.json());
app.use(
cookieSession({
name: "SocialMedia-auth-session",
secret: process.env.SESSION_SECRET,
httpOnly: true,
maxAge: 24 * 60 * 60 * 1000
})
);
app.use(passport.initialize());
app.use(passport.session());
// routes
app.use("/", routerLogin);
const port = process.env.PORT || 8000;
app.listen(port, () => console.log(`app listening on port ${port}!`));
Upvotes: 0
Views: 252
Reputation: 50
the problem was in axios call from the frontend
old code
const res = await axios.post("/logout", { withCredentials: true });
new code
const res = await axios.post("/logout", {}, { withCredentials: true })
Upvotes: 1