未呼叫护照反序列化用户

时间:2019-07-31 14:27:06

标签: node.js express passport.js passport-local

当我从我的响应前端发出获取请求以使用password.authenticate('./ local)登录时,将调用我的password.serializeUser,但未设置password.deserializeUser(并且未设置req.user)。

我已经在stackoverflow上阅读了许多有关此问题的答案,但无济于事。这是下面的代码。

所有这些都发生在我在server.js上的路由之前:

module.exports = function(passport) {

    passport.use(new LocalStrategy(
      function(username, password, done) {

        User.findOne({ username: username }, async function (err, user) {
          if (err) { return done(err); }
          if (!user) { return done(null, false); }
          const match = await bcrypt.compare(password, user.password);
          if (!match) { return done(null, false); }
          return done(null, user);
        });
      }
    ));

    passport.serializeUser(function(user, done) {
        console.log('this gets called logged)
        done(null, user.id);
    });

    passport.deserializeUser(function(id, done) {
        console.log('this does NOT GET LOGGED');
        User.findById(id, function(err, user) {
        done(err, user);
        });
    });
};

这是护照配置文件:

fetch('http://localhost:5000/authentication/login', {
            method: 'POST',
            body: JSON.stringify(this.state.formData),
            headers: {"Content-Type": "application/json"},
            mode: 'cors'
        })
            .then(res => res.json())
            .then(resObject => {
                if (resObject.errors) {
                    console.log('errors')
                } else {
                    this.props.dispatch(handleLoginuser(resObject.user))
                    this.setState({
                        redirect: true                      
                    })
                }           
            });

这是登录路径的反应获取请求:

componentDidMount() {
        fetch('http://localhost:5000/protectedroute', {
            method: 'GET',
            mode: 'cors',
            credentials: 'include'
        })
            .then(res => res.json())
            .then(resObject => {
                if(resObject.loggedIn) {
                    this.setState({
                        loggedIn: true
                    })
                }
            });         
    }

以下是对另一个应受保护的随机路由的提取请求:

app.post('/authentication/login', passport.authenticate('local'), (req, res) => {
        res.json({errors: false, user: req.user})
    });

app.route('/protected')
        .get(function(req, res) {
            //req.user will be undefined!
            if (req.user) {
                return res.json({loggedIn: true})
            } else {
                return res.json({loggedIn: false})
            }
        })

以下是登录和受保护的路由:

http://fake.com/?user=123&name=ali

2 个答案:

答案 0 :(得分:1)

在发送发帖请求时设置withCredentials: true对我来说很有效。

axios.post(uri, {
  email: email,
  password: password
}, {
  withCredentials: true
})

答案 1 :(得分:0)

我相信这是因为您在后端的发布/登录路线。
除非您使用官方文档中的样板代码(不适用于React),否则调用passport.authenticate中间件不会完成登录过程。 您需要调用req.login来完成登录过程。查看此示例

app.post('/authentication/login', (req, res, next) => {
    passport.authenticate('local', (err, theUser, failureDetails) => {
        if (err) {
            res.status(500).json({ message: 'Something went wrong authenticating user' });
            return;
        }

        if (!theUser) {
            res.status(401).json(failureDetails);
            return;
        }

        // save user in session
        req.login(theUser, (err) => {
            if (err) {
                res.status(500).json({ message: 'Session save went bad.' });
                return;
            }
            console.log('---123456789098765432345678---', req.user);
            res.status(200).json({{errors: false, user: theUser}});
        });
    })(req, res, next);
});