2017-10-17 2 views
2

로그인 할 때 req.user가 정의되지만 다른 경로에서는 req.user가 정의되지 않습니다. 어쩌면 내가 뭔가 잘못하고있는 것 같아서 생각이 다 떨어졌습니다.Node + Express + Passport + mongoose : req.user Undefined

또한 desirilization가 호출되지 않습니다

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

클라이언트 :

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

도움주세요, 세션 설정을 변경하려고했지만 도움이되지 않았습니다. 1 주일 이상 고칠 예정입니다.

P. 우편 배달부를 통해 확인하면 모든 것이 제대로 작동하며 deserializeUser가 호출되고 req.user가 정의 됨

+0

당신은 POST 요청에 대한 모든 데이터 파서를 사용하고 있습니까? – Sagar

+0

@Sagar 아니, 정확히 무슨 말을하는거야, 어쩌면 내가 질문을 이해하지 못했을거야 –

+0

코드를 노드 뼈대 프로젝트에 복사했는데 모두 작동하는 것처럼 보였다. 탈 직렬화가 호출되었습니다. (필자는 passport.use (User.createStrategy())를 제거하고 필요없는 압축을 사용합니다.) 어떻게 당신의 API를 테스트하고 있습니까? CURL 등의 도구를 사용하는 경우 로그인 중에 생성 된 쿠키를 다른 요청과 함께 다시 전달하는지 확인하고 있습니까? –

답변

0

문제는 클라이언트에 있습니다. 나는 이것이 누군가를 돕기를 바랍니다.

은 작동하지 않습니다 :

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

작업을 :

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) 
     }); 
관련 문제