2017-01-10 8 views
0

Я начал разработку небольшого проекта, где у меня есть React with Redux на стороне клиента, а бэкэнд выполняется с помощью Node, Express и Passport.js Я буду попробуйте лучше описать, с чем я борюсь в течение нескольких часов. после аутентификации, когда пользователь отправляется с сервера на клиент, поле req.session.passport устанавливается вместе с req.user. но когда я делаю следующий запрос, независимо от того, выходит ли он или, например,/something/add, эти поля не определены.Express + Passport - req.session.passport undefined при последующих запросах

при аутентификации, serializeUser вызывается, но deserializeUser нет, и я не думаю, что это должно быть здесь, возможно, неправильно. насколько я входил в отладку проблемы, вызывает req.login. на следующих запросах кажется, что паспорт ничего не делает, и у меня нет идей и сторонников из SO и google. Я не пробовал пользовательский обратный вызов.

req.session перед отправкой anwser клиенту выглядит следующим образом:

Session { 
    cookie: 
    { path: '/', 
    _expires: 2017-01-11T02:31:49.235Z, 
    originalMaxAge: 14400000, 
    httpOnly: false, 
    secure: false } } 

код на стороне сервера:

passport.serializeUser(function(user, done) { 
     done(null, user._id); 
    }); 

    passport.deserializeUser(function(id, done) { 
     global.Models.User.findById(id, function(err, user) { 
      done(err, user); 
     }); 
    }); 

    passport.use(new LocalStrategy(
     { 
      usernameField: 'login', 
      passwordField: 'password', 
      passReqToCallback: true 
     }, 
     function(req, login, password, done) { 
      global.Models.User.logIn({login: login, password: password}, function(err, user){ 

       if(err){ 
        done(err); 
       } 
       else{ 
        done(null, user); 
       } 

      }); 
     } 
    )); 
    var app = express(); 
    var router = express.Router(); 
    router.use(cookieParser()); 
    router.use(bodyParser.urlencoded({extended: false})); 
    router.use(bodyParser.json()); 
    router.use(session({ 
     cookie : { 
      secure : false, 
      maxAge : (4 * 60 * 60 * 1000), 
      httpOnly: false 
     }, 
     secret: this._config.session.secret, 
     resave: false, 
     saveUninitialized: true 
    })); 
    router.use(passport.initialize()); 
    router.use(passport.session()); 

    require('./Router')(); 
    app.use(router); 

сессия объект здесь является экспресс-сессия. код под Router.js требуется выше

var User = require('../Models/User'); 
var News = require('../Models/News'); 

var passport = global.Application.getInstanceOf("passport"); 

function setRoutes(){ 
    router.use(function (req, res, next) { 

     var log = global.Application.getInstanceOf("logger"); 

     var clientIP = req.headers['x-forwarded-for'] || 
         req.connection.remoteAddress || 
         req.socket.remoteAddress || 
         req.connection.socket.remoteAddress; 

     log.log("info", req.method + " request from ip: " + clientIP); 

     res.header('Access-Control-Allow-Origin', 'http://localhost:8080'); 
     res.header('Access-Control-Allow-Credentials', true); 
     res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS'); 
     res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With'); 

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

    }); 

    router.get('/ping', function(req, res){ 
     res.send('ping'); 
    }); 

    router.get('/login/:login', (req, res) => { 
     Database.client.query(Database.queries.USER_LOGIN, {login: req.params.login}, {useArray: true}, 
     (err, rows) => { 
      if(err){ 
       res.send({error: "ERROR_DATABASE"}); 
      } 
      else{ 
       res.send(rows[0][0]); 
      } 
     }); 
    }); 

    router.post('/login', passport.authenticate('local', {session: true}), 
     function(req, res){ 
      console.log(req.session); 
      req.session.save(); 
      res.send(req.user); 
     } 
    ); 

    router.post('/register', (req, res) => { 
     User.create(req.body, (err, result) => { 
      if(err){ 
       res.send({error: "ERROR_DATABASE"}); 
      } 
      res.send(result); 
     }); 
    }); 

    router.get('/logout', function(req, res){ 
     console.log(req.session); 
     req.logout(); 
     res.sendStatus(200); 
    }); 

    router.post('/cms/article', isAuthenticated, (req, res) => { 
     res.send("BLA"); 
    }); 

    function isAuthenticated(req, res, next){ 
     console.log(req.user); 
     console.log(req.session); 
     console.log(req.session.passport); 
     if(req.isAuthenticated()){ 
      next(); 
     } 
     else{ 
      res.send("OK"); 
     } 
    } 
} 

module.exports = setRoutes; 

ответ

0

Я решил проблему.

Пояснение: Куки были отправлены экспресс-клиентом, но они не были сохранены. Для этого ему нужно было перейти от использования $ .post к $ .ajax с параметром xhrFields, установленным в {withCredentials: true}.

Кроме того, проблема также может заключаться в том, что cookieParser, вероятно, теперь должен знать секретный файл cookie.