0

I'm trying to login with passport session exrpess and mongodb, the problem is that it's not working on the client side (my session is created correctly even from the client, but when I have to enter a protected route the req.user returns undefined) I'm using axios to handle the requests to the server, as it says in the title, when I try it with postman to the same routes that I have on the client it works perfect...

**The server responds with the else of this function (located in passport.js): **

const checkAuthenticated = (req, res, next) => {
    console.log("REQUEST USER", req.user)
    console.log("BREAK HERE ", req.isAuthenticated())
    if (req.isAuthenticated()){ 
        console.log("DSADASDASDAS ", req.isAuthenticated())
        return next() 
    }else{
        // res.status(302).redirect("http://localhost:3000/login")
        res.status(302).json({message: "??????"})    
    }
}

I suspect it has something to do with the deserialize or the way I handle requests on the client side, if you can help me I would appreciate it

CLIENT SIDE: login.jsx

async function handleVerify(e){
    try {
      e.preventDefault()
      const query = await axios.post("http://localhost:8080/api/user/login", {
        username: formValue.username,
        password: formValue.password
      });
      console.log(query)

      if(query.status === 302 || 200){
        console.log("Login successfull")     //last thing on console 
        const queryPost = await axios.get("http://localhost:8080/api/post/home", {    //Breaks Here
          withCredentials: true 
        })     
        console.log("DSADSADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", queryPost)
        if(queryPost.status === 200){
          navigate("/")
        }

      }else{
        setFormValue({
          username: "",
          password: ""
        })
      }
    } catch (error) {
      console.log("HANDLE VERIFY ERROR ", error)

    }  
  }

PASSPORT: passport.js

const passport = require("passport")
const LocalStrategy = require("passport-local").Strategy

const jwt = require("jsonwebtoken")
const secretKey = "123"

const controller = require("../controllers/userController")


passport.use("auth", new LocalStrategy(
    async (username, password, done) => {
        try {
            const result = await controller.auth(username, password)  
            
            console.log("PASSPORT USER: ", result)
            if(result.status === 200){
                const serializedUser = {email: result.user[0].email}

                const payload = {
                    username: result.user[0].username,
                    email: result.user[0].email
                
                }
                const token = jwt.sign(payload, secretKey, {expiresIn: "1h" })
                console.log("token  ", token)

            
                // localStorage.setItem("token", token)

                return done(null, serializedUser, token)
            }else{
                return done(null, false, {message: "Usuario no encontrado"})
            }
            
        } catch (error) {
            console.log("PASSPORT AUTH ERROR ", error)
            return done(null, error)
        }
    }
)) 


passport.serializeUser((user, done) =>{
    console.log("SERIALIZED", user)
    done(null, user.email)

})



passport.deserializeUser(async (email, done) =>{
    try {
        // const completeUser = await controller.getByEmail(email)
        console.log("DESERIALIZED", email)
        done(null, email)
    } catch (error) {
        console.log("DESERIALIZE ERROR ", error)
        done(error)
    }
})




const checkAuthenticated = (req, res, next) => {
    console.log("REQUEST USER", req.user)
    console.log("BREAK HERE ", req.isAuthenticated())
    if (req.isAuthenticated()){ 
        console.log("DSADASDASDAS ", req.isAuthenticated())
        return next() 
    }else{
        // res.status(302).redirect("http://localhost:3000/login")
        res.status(302).json({message: "??????"})    
    }
}



const checkToken = (req, res, next) =>{
    const token = req.headers.authorization?.split(" ")[1]
    console.log("middle TOKEN ", token)
        if(!token){
            return res.status(401).json({message: "Token no proporcionada"})
        }
    try {
        const decoded = jwt.verify(token, secretKey)
        req.user = decoded
        next()
    } catch (error) {
        return res.status(403).json(error)
    }
}

module.exports = {
    checkToken,
    checkAuthenticated,
    passport
}

SERVER INDEX: server.jS

require('dotenv').config();
const express = require("express")
const passport = require("passport")
const session = require("express-session")
const http = require("http")
const cors = require("cors")

const {checkToken, checkAuthenticated} = require("./security/passport")
const MongoStore = require("connect-mongo")
const sessionOpts = {
    secret: "shhh",
    resave: false,
    saveUninitialized: false,
    store: MongoStore.create({
        mongoUrl: "MONGOURL",            
        dbName: "test",
        collectionName: "sessions"
    })
}


const app = express();
const PORT = 8080;

app.use(cors({
    origin: "http://localhost:3000",
    credentials: true
}))

app.use(express.json())
app.use(express.urlencoded({ extended: true }))

app.use(session(sessionOpts))
app.use(passport.initialize());
app.use(passport.session());



const { router: userRouter } = require("./routers/api/user");
const { router: postRouter } = require("./routers/api/posts");
const interactionsRouter = require("./routers/api/interactions")



app.use("/api/user", userRouter)
app.use("/api/post", checkAuthenticated, postRouter)    
app.use("/api/interactions", checkToken, interactionsRouter)




const server = http.createServer(app)
server.listen(PORT, () => {

    console.log("Server running")

})



server.on("error", () => {

    console.log("Something failed", "error")

})

POST ROUTES: post.js

const express = require("express");
const {Router} = express;
const router = Router();

const PostModel = require("../../models/post");
const controller = new PostModel


router.get("/home", controller.getAll)

router.post("/home/post", controller.post)


module.exports = {
    router,
    controller
}

USER ROUTES: user.js

const express = require("express");
const {Router} = express;
const router = Router();


const controller = require("../../controllers/userController")

const {passport} = require("../../security/passport");
const {checkAuthenticated} = require("../../security/passport")


router.post("/login", passport.authenticate("auth"),controller.verify)

router.post("/login/r", passport.authenticate("auth"), controller.register)

router.get("/logout", controller.logout)


module.exports = {
    router,
    controller
}

The flow goes until the serialization and creation of the session, then it doesn't work, I saw many similar problems but the answers of these did not help me

0 Answers0