2017-10-17 14 views
2

Lorsque vous vous connectez, req.user est défini, mais sur d'autres chemins, req.user n'est pas défini. Peut-être que je fais quelque chose de mal, j'ai manqué d'idées.Node + Express + Passport + Mongoose: req.user Non défini

Aussi desirilization est jamais appelé

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:

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

Aide s'il vous plaît, j'ai essayé de modifier les paramètres des sessions, cela n'a pas aidé. J'essaie de réparer pendant plus d'une semaine.

P.S. Vérifié par le facteur, tout fonctionne là, deserializeUser est appelé et req.user défini

+0

Utilisez-vous analyseur de données pour les demandes de poste? – Sagar

+0

@Sagar non, de quoi parlez-vous exactement, peut-être que je n'ai pas compris la question –

+0

J'ai copié le code dans un projet de squelette de nœud et tout semblait fonctionner. Désérialiser a été appelé. (J'enlève passport.use (User.createStrategy()), et la compression comme je n'en avais pas besoin). Comment testez-vous votre api? Si vous utilisez un outil comme CURL etc, assurez-vous de transmettre le cookie créé lors de la connexion avec d'autres demandes? –

Répondre

0

Le problème était sur le client dans cors. J'espère que ça aidera quelqu'un.

ne fonctionne pas:

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

travail:

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