Node js passport认证,登录后无法获取用户数据

问题描述 投票:0回答:0

我正在开发一个节点 js 反应网站并使用护照我想管理用户的登录和注册会话。我可以成功注册用户并在我的 MongoDB 数据库中查看他们的数据,我也可以成功登录。但是当我尝试使用 req.user 检索已登录用户的数据时,我做不到,它给了我“未定义”并且应用程序似乎没有会话的任何内存。这是我的节点 js 代码:

mongoose.connect("mongodb://localhost:27017/userDB", {
    useNewUrlParser: true, 
    useUnifiedTopology: true
});

const user = new mongoose.Schema({
    username: String,
    password: String
});
const User = new mongoose.model("User", user);

//middleware
app.use(session({
    secret: "secret",
    resave: false,
    saveUninitialized: true,
}));
app.use(express.urlencoded({
    extended: false
 }));
 app.use(express.json());

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

app.use(cookieParser("secret"));
app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser((user, cb) => {
    console.log("serializing user");
    cb(null, user.id);
});
passport.deserializeUser((id, cb) => {
    User.findById(id).then((err, user) => {
        if(err) throw err;
        console.log("id: " + id);
        console.log("userid: " + user);
        const userInformation = {
            username: user.email,
        };
        cb(err, user);
    }).catch((err) => {console.error(err)});
});

passport.use(
    new localStrategy(async (username, password, done) => {
        try{
            const user = await User.findOne({username: username});
            if(!user) {
                console.log("no user");
                return done(null, false);
            }
            bcrypt.compare(password, user.password, (err, result) => {
                if(err) throw err;
                if(result === true) {
                    return done(null, user);
                } else {
                    return done(null, false);
                }
            });
        } catch(err){
            console.log("err inside localStrategy: " + err);
            throw err;

        }

    })
);

app.post("/login", (req, res, next) => {
    console.log("inside login");
    passport.authenticate("local", (err, user, info) => {
        console.log("inside authenticate, user: " + user);
        if(err) {
            console.log("err: " + err);
            throw err;
        }
        if(!user) {
            console.log("No user");
            res.status(400);
            res.send("No user exists");
        }
        else {
            console.log("inside else");
            req.logIn(user, (err) => {
                if(err) throw err;
                res.status(200).json({message: "login successful"});
            });
        }
    })(req, res, next);
});

app.get("/isLogin", function(req, res) {
    console.log("in isLogin");
    if(req.isAuthenticated()){
        console.log("it is logged in");
        res.status(200).json(req.user);
    }
    else {
        console.log("it is not logged in");
        res.status(200).json({message: "user not logged in"});

    }
});

app.listen(4000, () => {console.log("server started on port 4000")});

登录部分有效,但 /isLogin 表示用户未登录,而且当我尝试获取 req.user 时,它返回“未定义”。对此有任何帮助将不胜感激。谢谢

javascript node.js mongodb authentication passport.js
© www.soinside.com 2019 - 2024. All rights reserved.