passport.js req.user returns undefined

Viewed 32

I am trying to perform a user authentication using nodejs + sequelize + passport.js (passport-local) everything works great, the users are saved in the encrypted database, but when I want to obtain the data from the get / user route , it returns me undefined req.user, so I can't get the data, why is this? I thank you very much in advance

[config.js]

const Sequelize = require("sequelize");
require("dotenv").config();

const config = new Sequelize(process.env.DATABASE, "root", process.env.PASS, {
  host: process.env.HOST,
  port: process.env.PORTSQL,
  logging: false,
  dialect: "mysql",
  define: {
    timestamps: false,
  },
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000,
  },
  operatorAliases: false,
});

config
  .authenticate()
  .then(() => {
    console.log("DB SEQUELIZE CONNECTED");
  })
  .catch((err) => console.error(err));

module.exports = config;

[index.js]

require("dotenv").config();
const Server = require("./models/Server.js");
const server = new Server();

server.listener();

[models/Server.js]

require("dotenv").config();
require("../utils/config.js");
const express = require("express");
const cors = require("cors");
const morgan = require("morgan");
const movementsRouter = require("../routes/MovementsRouter.js");
const usersRouter = require("../routes/UsersRouter.js");
const session = require("express-session");
const path = require("path");
const passport = require("../utils/passport.js");
const Sequelize = require("../utils/config.js");
 

class Server {
  constructor() {
    this.app = express();
    this.PORT = process.env.PORT || 8080;
    this.settings();
    this.middlewares();
    this.routes();
  }

  settings() {
    this.app.set("port", process.env.PORT || this.port);
  }

  middlewares() {
    this.app.use(cors());
    this.app.use(express.json());
    this.app.use(express.urlencoded({ extended: true }));
    this.app.use(
      express.static(path.join(__dirname, "/front/build/index.html"))
    );
    this.app.use(morgan("dev"));
    this.app.use(
      session({
        secret: process.env.MYSECRET,
        resave: true,
        saveUninitialized: true,
      })
    );
    this.app.use(passport.initialize());
    this.app.use(passport.session());
  }

  routes() {
    this.app.use("/", movementsRouter);
    this.app.use("", usersRouter);
  }

  listener() {
    Sequelize.sync({ force: false }).then(() => {
      this.app
        .listen(this.app.get("port"), () => {
          console.log(`Server on port ${this.app.get("port")}`);
        })
        .on("error", (err) => {
          console.log(err);
        });
    });
  }
}

module.exports = Server;

[passport.js]

let bcrypt = require("bcrypt-nodejs");
let passport = require("passport");
const { User } = require("../models/Users.js");
let LocalStrategy = require("passport-local").Strategy;

passport.use(
  "local-signup",
  new LocalStrategy(
    {
      usernameField: "email",
      passwordField: "password",
      passReqToCallback: true,
    },
    function (req, email, password, done) {
      console.log("Signup for - ", email);
      let generateHash = function (password) {
        return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
      };
      User.findOne({
        where: {
          email: email,
        },
      }).then(function (user) {
        if (user) {
          return done(null, false, {
            message: "That email is already taken",
          });
        } else {
          let userPassword = generateHash(password);
          let data = {
            email: email,
            password: userPassword,
            naming: req.body.naming,
          };

          User.create(data).then(function (newUser, created) {
            if (!newUser) {
              return done(null, false);
            }
            if (newUser) {
              return done(null, newUser);
            }
          });
        }
      });
    }
  )
);

//LOCAL SIGNIN
passport.use(
  "local-signin",
  new LocalStrategy(
    {
      usernameField: "email",

      passwordField: "password",

      passReqToCallback: true,
    },

    function (req, email, password, done) {
      let isValidPassword = function (userpass, password) {
        return bcrypt.compareSync(password, userpass);
      };
      console.log("logged to", email);
      User.findOne({
        where: {
          email: email,
        },
      })
        .then(function (user) {
          console.log(user);
          if (!user) {
            return done(null, false, {
              message: "Email does not exist",
            });
          }

          if (!isValidPassword(user.password, password)) {
            return done(null, false, {
              message: "Incorrect password.",
            });
          }

          let userinfo = user.get();
          return done(null, userinfo);
        })
        .catch(function (err) {
          console.log("Error:", err);

          return done(null, false, {
            message: "Something went wrong with your Signin",
          });
        });
    }
  )
);

passport.serializeUser(function (user, done) {
  done(null, user.id);
});

passport.deserializeUser(function (id, done) {
  User.findById(id).then(function (user) {
    console.log(user + "ASDASDASDASDAS");
    if (user) {
      done(null, user.get());
    } else {
      done(user.errors, null);
    }
  });
});

module.exports = passport;

[models/Users]

const sequelize = require("sequelize");
const config = require("../utils/config.js");

const User = config.define("users", {
  id: {
    type: sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true,
    allowNull: false,
  },
  naming: {
    type: sequelize.STRING,
    allowNull: false,
  },
  email: {
    type: sequelize.STRING,
    allowNull: false,
  },
  password: {
    type: sequelize.STRING,
    allowNull: false,
  },
});

module.exports = {
  User,
};

[UsersRouter.js]

const express = require("express");
const router = express();
const passport = require("../utils/passport.js");
const { User } = require("../models/Users.js");

router.post("/register", (req, res) => {
  passport.authenticate("local-signup", function (error, user, info) {
    if (error) {
      return res.status(500).json({
        message: error || "Something happend",
        error: error.message || "Server error",
      });
    }
    req.logIn(user, function (error, data) {
      if (error) {
        return res.status(500).json({
          message: error || "Something happend",
          error: error.message || "Server error",
        });
      }

      return res.json(user);
    });
  })(req, res);
});

router.post("/login", function (req, res) {
  passport.authenticate("local-signin", function (error, user, info) {
    if (error) {
      return res.status(500).json({
        message: error || "Something happend",
        error: error.message || "Server error",
      });
    }
    req.logIn(user, function (error, data) {
      if (error) {
        return res.status(500).json({
          message: error || "Something happend",
          error: error.message || "Server error",
        });
      }
      user.isAuthenticated = true;
      return res.json(user);
    });
  })(req, res);
});

// route for get user data
router.get("/user", (req, res) => {
  console.log(req.user);
  if (req.user) {
    return res.json(req.user);
  } else {
    return res.status(401).json({
      message: "Unauthorized",
    });
  }
});

router.get("/logout", (req, res) => {
  req.logout((err) => {
    if (err) {
      logger.error(err);
    }
    res.redirect("/");
  });
});

module.exports = router;
0 Answers
Related