CodeLearner
CodeLearner

Reputation: 50

passport.js logout not working MERN stack

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

Answers (1)

CodeLearner
CodeLearner

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

Related Questions