Passport Node React

25 Views Asked by At

I need help, I am trying to make an application with PERN in which I want to do a login with passport and I am using sequelize for the postgres database

const express = require("express");
const cookieParser = require("cookie-parser");
const session = require("express-session");
const SessionStore = require("express-session-sequelize")(session.Store);
const passport = require("passport");
const LocalStrategy = require("passport-local");
const cors = require("cors");
const sequelize = require("./db").sequelize;
const User = require("./db").User;
const helpers = require("./helpers");

const app = express();

const sequelizeSessionStore = new SessionStore({
  db: sequelize,
});

app.use(cookieParser());
app.use(
  session({
    secret: "secretCode",
    store: sequelizeSessionStore,
    resave: false,
    saveUninitialized: false,
  })
);
app.use(passport.initialize());
app.use(passport.session());
app.use(express.json());
app.use(
  cors({
    origin: "http://localhost:5173",
    credentials: true,
  })
);

passport.use(
  "local-signup",
  new LocalStrategy(
    {
      usernameField: "email",
      passwordField: "password",
      passReqToCallback: true,
    },
    async (req, email, password, done) => {
      const user = await User.findOne({ where: { email: email } });
      if (user) {
        return done(null, false);
      } else {
        const newUser = new User();
        newUser.email = email;
        newUser.password = await helpers.encryptPassword(password);
        await newUser.save();
        done(null, newUser);
      }
    }
  )
);

passport.use(
  "local-signin",
  new LocalStrategy(
    {
      usernameField: "email",
      passwordField: "password",
      passReqToCallback: true,
    },
    async (req, email, password, done) => {
      const user = await User.findOne({ where: { email: email } });
      if (!user) {
        return done(null, false);
      }
      const validPassword = await helpers.matchPassword(
        password,
        user.password
      );
      if (!validPassword) {
        return done(null, false);
      }
      return done(null, user);
    }
  )
);

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

passport.deserializeUser(async (id, done) => {
  const user = await User.findByPk(id);
  done(null, user);
});

app.post("/signup", passport.authenticate("local-signup"), (req, res) => {
  res.json(req.user);
});

app.get("/getUser", isAuthenticated, (req, res, next) => {
  res.json(req.user);
});

app.post("/signin", passport.authenticate("local-signin"), (req, res) => {
  res.json(req.sessionID);
});

app.get("/logout", (req, res, next) => {
  req.logOut((err) => {
    if (err) throw err;
    res.json({ estado: "Desconectado" });
  });
});

function isAuthenticated(req, res, next) {
  if (req.isAuthenticated()) {
    return next();
  } else {
    return res.json({ estado: "No estas conectado" });
  }
}

try {
  sequelize.sync({ force: false });
  app.listen("3000");
  console.log("Base de datos conectada, servidor en puerto 3000.");
} catch (error) {
  console.error("Base de datos no disponible:", error);
}

it works for me so that I access through postman and do login, registration and I can obtain the user, but when I do it externally it is not possible to obtain the user even by sending the credentials from fetch and axios

0

There are 0 best solutions below