首页 > 解决方案 > 护照反序列化用户未被调用

问题描述

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

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

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

//Express body parser
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.json());

//Express Session
app.use(session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true,
  cookie: {
    secure: false
  }
}));

// Passport config
require('./config/passport')(passport);

//Passport Middleware
app.use(passport.initialize());
app.use(passport.session());

这是护照配置文件:

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})
            }
        })

标签: node.jsexpresspassport.jspassport-local

解决方案


withCredentials: true在发送帖子请求时进行设置对我有用。

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

推荐阅读