简体   繁体   English

Node + Express + Passport +猫鼬:req.user未定义

[英]Node + Express + Passport + Mongoose: req.user Undefined

When you log in, req.user is defined, but on other paths, req.user is undefined. 登录时,req.user已定义,但在其他路径上,req.user未定义。 Maybe I'm doing something wrong, I ran out of ideas. 也许我做错了事,我没有想法了。

Also desirilization is never called 绝不叫绝望

server.js: server.js:

var LocalStrategy = require('passport-local').Strategy;

const User = require('./models/user');

const app = express();

mongoose.Promise = global.Promise;

const mongoDB = 'mongodb://mlab.com:21494/tester';
mongoose.connect(mongoDB, { useMongoClient: true })
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error:'));

app.use(function (req, res, next) {
  res.header('Access-Control-Allow-Credentials', 'true');
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
  res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept, Authorization');

  if ('OPTIONS' == req.method) {
    res.sendStatus(200);
  } else {
    next();
  }
});

app.use(logger('dev'));

app.use(compression());

//////////////////////////////////////////////////


passport.use(new LocalStrategy(
  function(username, password, done) {
    console.log('Strategy>>>>');
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (!user.verifyPassword(password)) { return done(null, false); }
      return done(null, user);
    });
  }
));

passport.use(User.createStrategy());


passport.serializeUser(function (user, done) {
  console.log('SERIALIZE', user);   //called                     
  done(null, user.id);
});

passport.deserializeUser(function (id, done) {
  console.log('DESIRIALIZE'); // not called
  User.findById(id, function (err, user) {
    console.log('USER Desirialise', user);
    done(err, user);
  });
});
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
// Session
app.use(require('express-session')({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: false
}));

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



//=====================LOGIN==================================
app.use('/', require('./routes/userRouters'));

userRouters.js: userRouters.js:

const router = require('express').Router();
const jwt = require('jsonwebtoken');
const passport = require('passport');

const User = require('../models/user');

router.post('/signin', passport.authenticate('local'), function (req, res, next) {
  console.log('SIGN IN');
  const { user } = req
  const token = jwt.sign({ username: user.username, email: user.email, _id: user._id }, 'RESTFULAPIs')
  console.log('REQ USER>>', req.user); // defined
  console.log('SESION', req.session.cookie); // passport defined
  res.json({
    user: {
      user: user.username,
      email: user.email,
      created: user.created
    },
    token: token
  });
})

router.get('/test', function (req, res) {
console.log('============================================');
  console.log('reqUSER', req.user); //undefined
  console.log('SESION', req.session.cookie); // passport undefined 
  res.json(req.user); 
});
///////////////////////////////////////////////////
router.post('/register', function (req, res, next) {
  const { username, email, password } = req.body;

  User.register(
    new User({ username, email, password }),
    req.body.password,
    (err, account) => {
      if (err) {
        res.send({
          status: 400,
          error: err.message,
          data: {
            errorName: err.name
          }
        });

        return;
      }

      passport.authenticate('local')(req, res, function () {
        console.log('REG req.user:>>>>', req.user); // defined
        res.send({ auth: true })
      });
    });
})

router.get('/logout', function (req, res) {
  console.log('============================================');
  console.log('reqUSER', req.user); //undefined
  console.log('SESION', req.session.cookie); // passport undefined
  req.logout();
  res.json({ messageSuccessful: 'Logout successful' });
  consol.log(req.user)// null
});

Client: 客户:

 signUp(user) {
    const { cookies } = this.props;
    const date = new Date();
    date.setDate(date.getDate() + 2000)

    axios.post(`${URL}/register`, user).then((result) => {
      console.log('RESULT SIGNIN', result);

      if (result.data.error) {
        this.setState({ error: result.data.error })
      } 
        this.setState({
          message: result.data.message,
          auth: result.data.auth
        })
      }
    }
    )
  }

  signIn(user) {
    const { cookies } = this.props;
    const date = new Date();
    date.setDate(date.getDate() + 2000);
    axios.post(`${URL}/signin`, user).then((result) => {
      console.log('RESULT SIGNIN', result);
      if (result.data.error) {
        this.setState({ loginErrorMessage: result.data.error })
      } 
        this.setState({
          loginErrorMessage: '',
          modalIsOpen: false,
          auth: true
        })
      }
    }
    )
  };

Help please, I tried to change the settings of sessions, it did not help. 请帮助,我试图更改会话的设置,但没有帮助。 I'm trying to fix for more than a week. 我试图修复一个多星期。

PS Checked through the postman, everything works there, deserializeUser is called and req.user defined PS通过邮递员检查,一切正常,deserializeUser被调用并要求req.user定义

The problem was on the client in cors. 问题出在cors的客户端上。 I hope this helps someone. 我希望这可以帮助别人。

Does not work: 不起作用:

axios.post(`${URL}/signin`, user).then((result) => {
//something
})

Working: 工作:

const myInit = {
      method: 'post',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(user),
      mode: 'cors',
      credentials: "include",
    };

    fetch(`${URL}/signin`, myInit).then(res => res.json())
      .then(res => {
        console.log(res)
      });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM